Ich habe mit threads in wxWidgets in so ziemlich alle Möglichkeiten beschrieben hier, und ich kann sagen, dass die Verwendung von benutzerdefinierten Ereignissen, obwohl Sie ursprünglich ein wenig komplexer, spart Euch einige Kopfschmerzen auf lange Sicht. (Die wxMessageQueue Klasse ist ganz nett, aber wenn ich es benutzt habe, fand ich es zu lecken; ich habe Sie nicht überprüft, ist es in etwa ein Jahr, obwohl.)
Ein einfaches Beispiel:
MyFrm.cpp
#include"MyThread.h"
BEGIN_EVENT_TABLE(MyFrm,wxFrame)
EVT_COMMAND(wxID_ANY, wxEVT_MYTHREAD,MyFrm::OnMyThread)
END_EVENT_TABLE()voidMyFrm::PerformCalculation(int someParameter){//create the threadMyThread*thread =newMythread(this, someParameter);
thread->Create();
thread->Run();//Don't worry about deleting the thread, there are two types of wxThreads //and this kind deletes itself when it's finished.}voidMyFrm::OnMyThread(wxCommandEvent& event){unsignedchar* temp =(unsignedchar*)event.GetClientData();//do something with temp, which holds unsigned char* data from the thread//GetClientData() can return any kind of data you want, but you have to cast it.delete[] temp;}
#include"MyThread.h"
DEFINE_EVENT_TYPE(wxEVT_MYTHREAD)MyThread::MyThread(wxEvtHandler* pParent,int param): wxThread(wxTHREAD_DETACHED), m_pParent(pParent){//pass parameters into the thread
m_param = param;}void*MyThread::Entry(){
wxCommandEvent evt(wxEVT_MYTHREAD,GetId());//can be used to set some identifier for the data
evt.SetInt(r);//whatever data your thread calculated, to be returned to GUI
evt.SetClientData(data);
wxPostEvent(m_pParent, evt);return0;}
Ich glaube, das ist viel mehr klare, prägnante Beispiel, als die, die das wiki bietet. Natürlich ließ ich Gesetzbuchs über die tatsächlich dem Start der app (wx convention machen würde, dass MyApp.cpp) und alle anderen nicht-thread-bezogenen code.
Wenn Sie einfach brauchen, um etwas Arbeit im hintergrund, bis es fertig ist -- Feuer-und-vergessen, wenn Sie so etwas wie dieses:
//warning: off the top of my head ;-)classMyThread:public wxThread
{public:MyThread(): wxThread(wxTHREAD_DETACHED){if(wxTHREAD_NO_ERROR ==Create()){Run();}}protected:virtualExitCodeEntry(){//do something here that takes a long time//it's a good idea to periodically check TestDestroy()while(!TestDestroy()&&MoreWorkToDo()){DoSaidWork();}returnstatic_cast<ExitCode>(NULL);}};MyThread* thd =newMyThread();//auto runs & deletes itself when finished
Mit MingW32 und Codeblocks ich habe die folgenden warning: EVENT redeclared without dllimport attribute: previous dllimport ignored. Die soultion nutzen dieser ist, dass, wenn Sie nicht brauchen, um zu exportieren, die Veranstaltungen, die Nutzung DEFINE_LOCAL_EVENT_TYPE und DECLARE_LOCAL_EVENT_TYPE (statt DEFINE_EVENT_TYPE und DECLARE_EVENT_TYPE).
Wenn Sie möchten, übergeben Sie die Objekte über SetClientData(), stellen Sie sicher, Sie erstellen die Daten mit Hilfe der new Betreiber in die abnehmbare thread. Die aufrufende Anwendung muss dann delete die Daten, sobald es kopiert.
Beispiel:
BEGIN_DECLARE_EVENT_TYPES()
DECLARE_LOCAL_EVENT_TYPE(wxEVT_CALC_THREAD,-1)
END_DECLARE_EVENT_TYPES()void*MyThread::Entry(){
wxCommandEvent evt(wxEVT_CALC_THREAD,GetId());//do some workvector<map<int,int>>*vm =newvector<map<int,int>>();//perform operations with the object vm ...
evt.SetClientData((void*)vm);
wxPostEvent(m_pParent, evt);}
und in der aufrufenden Anwendung:
DEFINE_LOCAL_EVENT_TYPE(wxEVT_CALC_THREAD)//change this to your event table
BEGIN_EVENT_TABLE(...,...)
EVT_COMMAND(wxID_ANY, wxEVT_CALC_THREAD,ThreadDone)
END_EVENT_TABLE()voidThreadDone(wxCommandEvent& event){vector<map<int,int>>*temp =(vector<map<int,int>>*)event.GetClientData();//store the data in *temp delete temp;}
Wenn Ihr Programm ist einfach, und Sie nicht zu verwirren wollen um mit einem Gewinde versehen sind, können Sie erwägen den Aufruf Kindelement::Update() regelmäßig in Ihrem langen Funktion.
Ich habe mit threads in wxWidgets in so ziemlich alle Möglichkeiten beschrieben hier, und ich kann sagen, dass die Verwendung von benutzerdefinierten Ereignissen, obwohl Sie ursprünglich ein wenig komplexer, spart Euch einige Kopfschmerzen auf lange Sicht. (Die wxMessageQueue Klasse ist ganz nett, aber wenn ich es benutzt habe, fand ich es zu lecken; ich habe Sie nicht überprüft, ist es in etwa ein Jahr, obwohl.)
Ein einfaches Beispiel:
MyFrm.cpp
MyThread.h
MyThread.cpp
Ich glaube, das ist viel mehr klare, prägnante Beispiel, als die, die das wiki bietet. Natürlich ließ ich Gesetzbuchs über die tatsächlich dem Start der app (wx convention machen würde, dass MyApp.cpp) und alle anderen nicht-thread-bezogenen code.
Wenn Sie einfach brauchen, um etwas Arbeit im hintergrund, bis es fertig ist -- Feuer-und-vergessen, wenn Sie so etwas wie dieses:
Ein paar Tipps aus der Umsetzung der oben:
Mit MingW32 und Codeblocks ich habe die folgenden
warning: EVENT redeclared without dllimport attribute: previous dllimport ignored
. Die soultion nutzen dieser ist, dass, wenn Sie nicht brauchen, um zu exportieren, die Veranstaltungen, die NutzungDEFINE_LOCAL_EVENT_TYPE
undDECLARE_LOCAL_EVENT_TYPE
(stattDEFINE_EVENT_TYPE
undDECLARE_EVENT_TYPE
).Wenn Sie möchten, übergeben Sie die Objekte über
SetClientData()
, stellen Sie sicher, Sie erstellen die Daten mit Hilfe dernew
Betreiber in die abnehmbare thread. Die aufrufende Anwendung muss danndelete
die Daten, sobald es kopiert.Beispiel:
und in der aufrufenden Anwendung:
Wenn Ihr Programm ist einfach, und Sie nicht zu verwirren wollen um mit einem Gewinde versehen sind, können Sie erwägen den Aufruf Kindelement::Update() regelmäßig in Ihrem langen Funktion.