Осваиваю библиотеку. Сложности.

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
baytuch
Earned a small fee
Earned a small fee
Posts: 17
Joined: Fri Aug 24, 2012 2:45 pm
Location: Ukraine
Contact:

Осваиваю библиотеку. Сложности.

Post by baytuch »

Ребята, добрый день.
Начал понемногу осваивать библиотеку... ( я "чайник" ) В общем, мне нужно из функции core как-то получить доступ к методам объекта frame... core — "мозг" приложения.

Code: Select all

#include <wx/wx.h>
#include "msc.h"

BEGIN_EVENT_TABLE( MSCFrame, wxFrame )
	EVT_MENU( Menu_File_Quit, MSCFrame::OnQuit )
	EVT_MENU( Menu_File_About, MSCFrame::OnAbout )
	EVT_MENU( Menu_File_Test, MSCFrame::OnTest )
END_EVENT_TABLE()

IMPLEMENT_APP(MSCapp)


bool MSCapp::OnInit(){
  MSCFrame *frame = new MSCFrame( wxT( "MySERVER Client ( v 0.1 )" ), wxPoint(50, 50), wxSize(500, 300) );

  frame->Show(true);
  SetTopWindow(frame);
  return true;
};

MSCFrame::MSCFrame( const wxString& title, const wxPoint& pos, const wxSize& size )
  : wxFrame((wxFrame *)NULL, -1, title, pos, size){
    wxMenu *menuFile = new wxMenu;

    menuFile->Append( Menu_File_About, wxT( "&About..." ) );
    menuFile->AppendSeparator();
    menuFile->Append( Menu_File_Quit, wxT( "E&xit" ) );
    menuFile->AppendSeparator();
    menuFile->Append( Menu_File_Test, wxT( "Te&st" ) );

    wxMenuBar *menuBar = new wxMenuBar;
    menuBar->Append( menuFile, wxT( "&File" ) );

    SetMenuBar( menuBar );

    CreateStatusBar();
    SetStatusText( wxT( "Welcome to Kdevelop wxWidgets app!" ) );
};

//Командный процессор
void core(int com){
  if ( com == 0 ){
    wxMessageBox( wxT( "This is a wxWidgets Hello world sample" ), wxT( "About Hello World" ), wxOK );
  };
};

void MSCFrame::OnQuit( wxCommandEvent& WXUNUSED( event ) ){
  Close(true);
};

void MSCFrame::OnAbout( wxCommandEvent& WXUNUSED( event ) ){
  wxMessageBox( wxT( "This is a wxWidgets Hello world sample" ),
    wxT( "About Hello World" ), wxOK | wxICON_INFORMATION, this );
};

void MSCFrame::OnTest( wxCommandEvent& WXUNUSED( event ) ){
  core(0);
};
Last edited by baytuch on Sat Aug 25, 2012 9:29 pm, edited 1 time in total.
OS: Slackware 12.2, IDE: KDevelop, xwWidgets version: 2.8.10, Compiler: GCC 4.2.4;
OS: Windows XP HE SP2 ( orig ), IDE: Code::Blocks 10.05, wxWidgets version: 2.8.12, Compiler: GCC 4.
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Осваиваю библиотеку. Сложности.

Post by Mojo »

Если я правильно понял, вы имеете в виду что-то типа этого?:

Code: Select all

#include <wx/app.h>

#include "wx/wxprec.h"

#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif //WX_PRECOMP

#include <wx/string.h>
#include <wx/bitmap.h>
#include <wx/image.h>
#include <wx/icon.h>
#include <wx/menu.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/statusbr.h>
#include <wx/frame.h>

//Командный процессор
void myCore(int com)
{
  if ( com == 0 )
    wxMessageBox( wxT( "This is a wxWidgets Hello world sample" ), wxT( "About Hello World" ), wxOK );

};

class MSCFrame : public wxFrame
{
	private:

	protected:
		wxMenuBar* mbar;
		wxMenu* fileMenu;
		wxStatusBar* statusBar;

		// Virtual event handlers, overide them in your derived class
		virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
        void OnTest( wxCommandEvent& event ); //{ event.Skip(); }



	public:

		MSCFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("wxWidgets Application Template"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 481,466 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
		~MSCFrame();

};

///////////////////////////////////////////////////////////////////////////

MSCFrame::MSCFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
{
	this->SetSizeHints( wxDefaultSize, wxDefaultSize );

	mbar = new wxMenuBar( 0 );
	fileMenu = new wxMenu();


	wxMenuItem* m_OnTest;
	m_OnTest = new wxMenuItem( fileMenu, wxID_ANY, wxString( wxT("Test") ) , wxEmptyString, wxITEM_NORMAL );
	fileMenu->Append( m_OnTest );

	mbar->Append( fileMenu, wxT("&File") );


	this->SetMenuBar( mbar );

	statusBar = this->CreateStatusBar( 2, wxST_SIZEGRIP, wxID_ANY );

	// Connect Events
	this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MSCFrame::OnClose ) );
	this->Connect( m_OnTest->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MSCFrame::OnTest ) );

}

MSCFrame::~MSCFrame()
{
	// Disconnect Events
	this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MSCFrame::OnClose ) );
	this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MSCFrame::OnTest ) );
}


void MSCFrame::OnTest( wxCommandEvent& event )
{
    myCore(0);
    event.Skip();
}

////////////////////////////////////////////////////////////////////////////////////////


class MSCApp : public wxApp
{
    public:
        virtual bool OnInit();
};


IMPLEMENT_APP(MSCApp);

bool MSCApp::OnInit()
{
    MSCFrame* frame = new MSCFrame(0L);

    frame->Centre();
    frame->Show();

    return true;
}

Скомпилировал одним файлом вроде все работает.....
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
baytuch
Earned a small fee
Earned a small fee
Posts: 17
Joined: Fri Aug 24, 2012 2:45 pm
Location: Ukraine
Contact:

Re: Осваиваю библиотеку. Сложности.

Post by baytuch »

Просмотрел, скомпилировал, запустил, но так и не понял разницу. Обратил внимание на "event.Skip()"... ( буду признателен за комментарий ) Извините...
Мне нужно, к примеру, отправить в СтатусБар сообщение из этой функции...
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Осваиваю библиотеку. Сложности.

Post by Mojo »

Тогда лучше сделать эту функцию членом класса фрейма

Code: Select all

#include <wx/app.h>

#include "wx/wxprec.h"

#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif //WX_PRECOMP

#include <wx/string.h>
#include <wx/bitmap.h>
#include <wx/image.h>
#include <wx/icon.h>
#include <wx/menu.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/statusbr.h>
#include <wx/frame.h>


class MSCFrame : public wxFrame
{

    wxMenuBar* mbar;
    wxMenu* fileMenu;
    wxStatusBar* statusBar;

public:
    MSCFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("wxWidgets Application Template"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 481,466 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
    ~MSCFrame();

    // Virtual event handlers, overide them in your derived class
    virtual void OnClose( wxCloseEvent& event ){ event.Skip(); }

    void OnTest( wxCommandEvent& event ); //{ event.Skip(); }

    //Командный процессор
    void myCore(int com)
    {
        if ( com == 0 )
            //wxMessageBox( wxT( "This is a wxWidgets Hello world sample" ), wxT( "About Hello World" ), wxOK );
            statusBar->SetStatusText(wxT("Это новый текст статусной строки"));
    };

};



///////////////////////////////////////////////////////////////////////////

MSCFrame::MSCFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
{
    this->SetSizeHints( wxDefaultSize, wxDefaultSize );

    mbar = new wxMenuBar( 0 );
    fileMenu = new wxMenu();


    wxMenuItem* m_OnTest;
    m_OnTest = new wxMenuItem( fileMenu, wxID_ANY, wxString( wxT("Test") ) , wxEmptyString, wxITEM_NORMAL );
    fileMenu->Append( m_OnTest );

    mbar->Append( fileMenu, wxT("&File") );


    this->SetMenuBar( mbar );

    statusBar = this->CreateStatusBar( 2, wxST_SIZEGRIP, wxID_ANY );

    // Connect Events
    this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MSCFrame::OnClose ) );
    this->Connect( m_OnTest->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MSCFrame::OnTest ) );

}

MSCFrame::~MSCFrame()
{
    // Disconnect Events
    this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MSCFrame::OnClose ) );
    this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MSCFrame::OnTest ) );
}


void MSCFrame::OnTest( wxCommandEvent& event )
{
    myCore(0);
    event.Skip();
}

////////////////////////////////////////////////////////////////////////////////////////


class MSCApp : public wxApp
{
public:
    virtual bool OnInit();
};


IMPLEMENT_APP(MSCApp);

bool MSCApp::OnInit()
{
    MSCFrame* frame = new MSCFrame(0L);

    frame->Centre();
    frame->Show();

    return true;
}

event.Skip(); для того, что бы продолжить обработку сообщений http://docs.wxwidgets.org/stable/wx_wxe ... xeventskip

P.S. В нашем примере Скип можно опустить.
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Осваиваю библиотеку. Сложности.

Post by Mojo »

Или же ввести в функцию указатель на фрейм:

Code: Select all

#include <wx/app.h>

#include "wx/wxprec.h"

#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif //WX_PRECOMP

#include <wx/string.h>
#include <wx/bitmap.h>
#include <wx/image.h>
#include <wx/icon.h>
#include <wx/menu.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/statusbr.h>
#include <wx/frame.h>

class MSCFrame;

void myCore(int com, MSCFrame *frame);

class MSCFrame : public wxFrame
{

public:
    wxMenuBar* mbar;
    wxMenu* fileMenu;
    wxStatusBar* statusBar;


    MSCFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("wxWidgets Application Template"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 481,466 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
    ~MSCFrame();

    // Virtual event handlers, overide them in your derived class
    virtual void OnClose( wxCloseEvent& event ){ event.Skip(); }

    void OnTest( wxCommandEvent& event ); //{ event.Skip(); }

};

///////////////////////////////////////////////////////////////////////////

MSCFrame::MSCFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
{
    this->SetSizeHints( wxDefaultSize, wxDefaultSize );

    mbar = new wxMenuBar( 0 );
    fileMenu = new wxMenu();


    wxMenuItem* m_OnTest;
    m_OnTest = new wxMenuItem( fileMenu, wxID_ANY, wxString( wxT("Test") ) , wxEmptyString, wxITEM_NORMAL );
    fileMenu->Append( m_OnTest );

    mbar->Append( fileMenu, wxT("&File") );


    this->SetMenuBar( mbar );

    statusBar = this->CreateStatusBar( 2, wxST_SIZEGRIP, wxID_ANY );

    // Connect Events
    this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MSCFrame::OnClose ) );
    this->Connect( m_OnTest->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MSCFrame::OnTest ) );

}

MSCFrame::~MSCFrame()
{
    // Disconnect Events
    this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MSCFrame::OnClose ) );
    this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MSCFrame::OnTest ) );
}

void MSCFrame::OnTest( wxCommandEvent& event )
{
    myCore(0, this);
    event.Skip();
}

//Командный процессор
void myCore(int com, MSCFrame *frame)
{
    if ( com == 0 )
        //wxMessageBox( wxT( "This is a wxWidgets Hello world sample" ), wxT( "About Hello World" ), wxOK );
        frame->statusBar->SetStatusText(wxT("Это новый текст статусной строки"));
};

////////////////////////////////////////////////////////////////////////////////////////

class MSCApp : public wxApp
{
public:
    virtual bool OnInit();
};

IMPLEMENT_APP(MSCApp);

bool MSCApp::OnInit()
{
    MSCFrame* frame = new MSCFrame(0L);

    frame->Centre();
    frame->Show();

    return true;
}

Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Осваиваю библиотеку. Сложности.

Post by Mojo »

Или же сделать указатель на фрейм глобальным:

Code: Select all

#include <wx/app.h>

#include "wx/wxprec.h"

#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif //WX_PRECOMP

#include <wx/string.h>
#include <wx/bitmap.h>
#include <wx/image.h>
#include <wx/icon.h>
#include <wx/menu.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/statusbr.h>
#include <wx/frame.h>

class MSCFrame;

void myCore(int com);

class MSCFrame : public wxFrame
{

public:
    wxMenuBar* mbar;
    wxMenu* fileMenu;
    wxStatusBar* statusBar;


    MSCFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("wxWidgets Application Template"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 481,466 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
    ~MSCFrame();

    // Virtual event handlers, overide them in your derived class
    virtual void OnClose( wxCloseEvent& event ){ event.Skip(); }

    void OnTest( wxCommandEvent& event ); //{ event.Skip(); }

};

///////////////////////////////////////////////////////////////////////////

MSCFrame::MSCFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
{
    this->SetSizeHints( wxDefaultSize, wxDefaultSize );

    mbar = new wxMenuBar( 0 );
    fileMenu = new wxMenu();


    wxMenuItem* m_OnTest;
    m_OnTest = new wxMenuItem( fileMenu, wxID_ANY, wxString( wxT("Test") ) , wxEmptyString, wxITEM_NORMAL );
    fileMenu->Append( m_OnTest );

    mbar->Append( fileMenu, wxT("&File") );


    this->SetMenuBar( mbar );

    statusBar = this->CreateStatusBar( 2, wxST_SIZEGRIP, wxID_ANY );

    // Connect Events
    this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MSCFrame::OnClose ) );
    this->Connect( m_OnTest->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MSCFrame::OnTest ) );

}

MSCFrame::~MSCFrame()
{
    // Disconnect Events
    this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( MSCFrame::OnClose ) );
    this->Disconnect( wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( MSCFrame::OnTest ) );
}

void MSCFrame::OnTest( wxCommandEvent& event )
{
    myCore(0);
    event.Skip();
}



////////////////////////////////////////////////////////////////////////////////////////

MSCFrame* frame;

class MSCApp : public wxApp
{
public:
    virtual bool OnInit();
};

IMPLEMENT_APP(MSCApp);

bool MSCApp::OnInit()
{
    frame = new MSCFrame(0L);

    frame->Centre();
    frame->Show();

    return true;
}

//Командный процессор
void myCore(int com)
{
    if ( com == 0 )
        //wxMessageBox( wxT( "This is a wxWidgets Hello world sample" ), wxT( "About Hello World" ), wxOK );
        frame->statusBar->SetStatusText(wxT("Это новый текст статусной строки"));
};

Все это уже относится не к wxWidgets а чистому С++
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
baytuch
Earned a small fee
Earned a small fee
Posts: 17
Joined: Fri Aug 24, 2012 2:45 pm
Location: Ukraine
Contact:

Re: Осваиваю библиотеку. Сложности.

Post by baytuch »

Вот спасибо!... ( уже распечатал ) Последний вариант — то, что нужно.
п.с. Ubuntu 10.04 -- весч!..
OS: Slackware 12.2, IDE: KDevelop, xwWidgets version: 2.8.10, Compiler: GCC 4.2.4;
OS: Windows XP HE SP2 ( orig ), IDE: Code::Blocks 10.05, wxWidgets version: 2.8.12, Compiler: GCC 4.
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Осваиваю библиотеку. Сложности.

Post by Mojo »

baytuch wrote: п.с. Ubuntu 10.04 -- весч!..
У меня ща Xubuntu 12.04 гораздо лучше чем Ubuntu 10.04, забыл сменить подпись к моим постам....
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
baytuch
Earned a small fee
Earned a small fee
Posts: 17
Joined: Fri Aug 24, 2012 2:45 pm
Location: Ukraine
Contact:

Re: Осваиваю библиотеку. Сложности.

Post by baytuch »

У меня еще по мере всего возник вопросец: скажите, а после сборки программ под ОС Windows, ей для запуска на других машинах нужны какие-либо библиотеки или все компоненты wxWidgets сразу "вшиваются" в бинарник?..

Честно говоря, я не большой любитель обновляться ( предыдущая версия: Ubuntu 9.10 ). Последние обновление было обусловлено полной неработоспособностью некоторых программ... Любопытно посмотреть на работу этой ОС ( качну, поюзаю )...
OS: Slackware 12.2, IDE: KDevelop, xwWidgets version: 2.8.10, Compiler: GCC 4.2.4;
OS: Windows XP HE SP2 ( orig ), IDE: Code::Blocks 10.05, wxWidgets version: 2.8.12, Compiler: GCC 4.
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Осваиваю библиотеку. Сложности.

Post by Mojo »

baytuch wrote:У меня еще по мере всего возник вопросец: скажите, а после сборки программ под ОС Windows, ей для запуска на других машинах нужны какие-либо библиотеки или все компоненты wxWidgets сразу "вшиваются" в бинарник?..
Если wxWidgets собрана с динамической линковкой, то понадобятся какие-то dll-ки, а если собрать wxWidgets со статической линковкой, то никакие дополнительные библиотеки НЕ будут нужны, исполняемые файлы будут запускаться даже на флешке....
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
baytuch
Earned a small fee
Earned a small fee
Posts: 17
Joined: Fri Aug 24, 2012 2:45 pm
Location: Ukraine
Contact:

Re: Осваиваю библиотеку. Сложности.

Post by baytuch »

Я понял.
Использую пакет wxPack ( 2.8.12 ). У них на сайте нашел инструкцию по сборке, но как оно там собрано в релизе, так и не нашел... В общем, если собрано с динамической, то придется еще и пересобирать библиотеку, поскольку предполагается использование без каких-либо дополнительных компонентов...
Пока не критично, но вопрос повис...
OS: Slackware 12.2, IDE: KDevelop, xwWidgets version: 2.8.10, Compiler: GCC 4.2.4;
OS: Windows XP HE SP2 ( orig ), IDE: Code::Blocks 10.05, wxWidgets version: 2.8.12, Compiler: GCC 4.
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Осваиваю библиотеку. Сложности.

Post by Mojo »

baytuch wrote:Я понял.
Использую пакет wxPack ( 2.8.12 ). У них на сайте нашел инструкцию по сборке, но как оно там собрано в релизе, так и не нашел... В общем, если собрано с динамической, то придется еще и пересобирать библиотеку, поскольку предполагается использование без каких-либо дополнительных компонентов...
Пока не критично, но вопрос повис...
Я никогда не использовал wxPack, поэтому ничего сказать про него не могу. Но когда я сидел в винде, то я использовал Visual C++ Express Edition 2008 в которой легко собирал wxWidgets со статической линковкой. Там даже не пришлось никаких настроек делать, просто выбрал файл проекта для VS а уже там среди множества вариантов сборки (в выпадающем списке сверху) выбрал статическую сборку. И все. Все просто.
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
baytuch
Earned a small fee
Earned a small fee
Posts: 17
Joined: Fri Aug 24, 2012 2:45 pm
Location: Ukraine
Contact:

Re: Осваиваю библиотеку. Сложности.

Post by baytuch »

Потом поковыряюсь... :)

Скажите, а можно в одном потоке периодически вызывать функцию, скажем, каждые несколько секунд, при условии, что параллельно работает цикл опроса событий? Честно говоря, очень сомневаюсь, поскольку, как я понял, цикл "заклинивает", когда ожидает очередного события, что делает это "мероприятия" невозможным... Или может можно как-то временно прервать цикл для выполнения поточных служебных задач?..
OS: Slackware 12.2, IDE: KDevelop, xwWidgets version: 2.8.10, Compiler: GCC 4.2.4;
OS: Windows XP HE SP2 ( orig ), IDE: Code::Blocks 10.05, wxWidgets version: 2.8.12, Compiler: GCC 4.
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Осваиваю библиотеку. Сложности.

Post by Mojo »

baytuch wrote:Потом поковыряюсь... :)

Скажите, а можно в одном потоке периодически вызывать функцию, скажем, каждые несколько секунд, при условии, что параллельно работает цикл опроса событий? Честно говоря, очень сомневаюсь, поскольку, как я понял, цикл "заклинивает", когда ожидает очередного события, что делает это "мероприятия" невозможным... Или может можно как-то временно прервать цикл для выполнения поточных служебных задач?..
К сожалению, мне не приходилось сталкиваться с необходимостью работать с потоками. У меня другие цели и задачи которые я пытаюсь решить используя wxWidgets. Поэтому ничего определенного сказать не могу, рекомендую обратиться к документации по потокам: http://docs.wxwidgets.org/stable/wx_wxt ... rview.html
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
baytuch
Earned a small fee
Earned a small fee
Posts: 17
Joined: Fri Aug 24, 2012 2:45 pm
Location: Ukraine
Contact:

Re: Осваиваю библиотеку. Сложности.

Post by baytuch »

Долго-долго гуглил, читал, медитировал ( :) ) и понял, что мне вовсе не нужен параллельный поток. А зачем, ведь есть такой замечательный инструмент, как таймер, который сразу и одним махом решает все проблемы... В общем, а вот что меня так вдохновило:
http://forums.wxwidgets.org/viewtopic.php?f=1&t=16861
http://docs.wxwidgets.org/stable/wx_wxt ... timerevent
http://forums.realcoding.net/index.php?showtopic=22992

"По подобию и образу" ваших примеров переделал свой пример... Но не все так безоблачно — по событию таймера нет доступа к фрейму ( опять ) ( я там строчку с фреймом закомментировал ). Предполагаю, что проблема кроется в том, что событие источником события есть класс таймера... Собсно, вот... Не работает... Подскажите, пожалуйста...

*решил использовать отказаться от использования глобального указателя, так как уже нет смысла в его использовании...

.cpp:

Code: Select all

#include <wx/wx.h>
#include <wx/timer.h>
#include "msc.h"

BEGIN_EVENT_TABLE( MSCFrame, wxFrame )
	EVT_TIMER( TIMER_ID, MSCFrame::OnTimer )
	EVT_MENU( Menu_File_Quit, MSCFrame::OnQuit )
	EVT_MENU( Menu_File_About, MSCFrame::OnAbout )
	EVT_MENU( Menu_File_Test, MSCFrame::OnTest )
END_EVENT_TABLE()

IMPLEMENT_APP(MSCapp)

bool MSCapp::OnInit(){

  MSCFrame *frame = new MSCFrame( wxT( "MySERVER Client ( v 0.1 )" ), wxPoint(50, 50), wxSize(500, 300));

  frame->Show(true);
  SetTopWindow(frame);

  return true;
};

MSCFrame::MSCFrame( const wxString& title, const wxPoint& pos, const wxSize& size )
  : wxFrame((wxFrame *)NULL, -1, title, pos, size), m_timer(this, TIMER_ID){

    wxMenu *menuFile = new wxMenu;

    menuFile->Append( Menu_File_About, wxT( "&About..." ) );
    menuFile->AppendSeparator();
    menuFile->Append( Menu_File_Quit, wxT( "E&xit" ) );
    menuFile->AppendSeparator();
    menuFile->Append( Menu_File_Test, wxT( "Te&st" ) );

    wxMenuBar *menuBar = new wxMenuBar;
    menuBar->Append( menuFile, wxT( "&File" ) );

    SetMenuBar( menuBar );

    CreateStatusBar();
    SetStatusText( wxT( "Welcome to Kdevelop wxWidgets app!" ) );

    m_timer.Start(10000);
};


//Командный процессор
void core(int com, MSCFrame *frame){
  if ( com == 0 ){
//    wxSleep(10);
    frame->SetStatusText(wxT("Test"));
//    wxMessageBox( wxT( "This is a wxWidgets Hello world sample" ), wxT( "About Hello World" ), wxOK );
  };
};

void MSCFrame::OnQuit( wxCommandEvent& WXUNUSED( event ) ){
  Close(true);
};

void MSCFrame::OnAbout( wxCommandEvent& WXUNUSED( event ) ){
  wxMessageBox( wxT( "This is a wxWidgets Hello world sample" ),
    wxT( "About Hello World" ), wxOK | wxICON_INFORMATION, this );
};

void MSCFrame::OnTest( wxCommandEvent& WXUNUSED( event ) ){
  core(0, this);
};

void MSCFrame::OnTimer( wxTimerEvent& event ){
  wxMessageBox( wxT( "This is a wxWidgets Hello world sample" ),
    wxT( "Сообщение от таймера" ), wxOK | wxICON_INFORMATION, this );
//  frame->SetStatusText(wxT("Test"));
};
.h

Code: Select all


#ifndef _MSC_H_
#define _MSC_H_

#include <wx/wx.h>
#include <wx/timer.h>


/**
 * @short Application Main Window
 * @author Gladun Alexander <[email protected]>
 * @version 0.1
 */

class MSCapp : public wxApp{
  public:
    virtual bool OnInit();
};

class MSCFrame : public wxFrame{
  public:
    MSCFrame( const wxString& title, const wxPoint& pos, const wxSize& size );
    void OnQuit( wxCommandEvent& event );
    void OnAbout( wxCommandEvent& event );
    void OnTest( wxCommandEvent& event );
    void OnTimer(wxTimerEvent& event);

  private:
  DECLARE_EVENT_TABLE()
  wxTimer m_timer;
};

enum{
  Menu_File_Quit = 100,
  Menu_File_About = 101,
  Menu_File_Test = 102,
  TIMER_ID = 1000
};

#endif // _MSC_H_
OS: Slackware 12.2, IDE: KDevelop, xwWidgets version: 2.8.10, Compiler: GCC 4.2.4;
OS: Windows XP HE SP2 ( orig ), IDE: Code::Blocks 10.05, wxWidgets version: 2.8.12, Compiler: GCC 4.
Post Reply