При работе с потоками часто приходится делать кучу однотипных задач: создавать класс, производный от wxThread
, реализовывать метод Entry()
для этого класса, синхронизацию с главным потоком и т.д.
Eran, автор CodeLite IDE поделился кодом класса JobQueue, который реализует пул потоков и позволяет выполнять задачи в фоновом режиме.
class MyJob : public Job {
public:
MyJob(){}
~MyJob(){}
// Implement your processing code here
void Process() {
wxPrintf(wxT("Just doing my work...n"));
};
};
// define some custom job with progress report
class MyJobWithProgress : public Job {
public:
MyJobWithProgress(wxEvtHandler *parent) : Job(parent){}
~MyJobWithProgress(){}
// Implement your processing code here
void Process() {
// report to parent that we are at stage 0
Post(0, wxT("Stage Zero"));
// do the work
wxPrintf(wxT("Just doing my work...n"));
// report to parent that we are at stage 1
Post(1, wxT("Stage Zero Completed!"));
};
};
// somewhere in your code, start the JobQueue
// for the demo we use pool of size 5
JobQueueSingleton::Instance()->Start(5);
// whenever you want to process MyJob(), just create new instance of MyJob() and add it to the JobQueue
JobQueueSingleton::Instance()->AddJob( new MyJob() );
// at shutdown stop the job queue and release all its resources
JobQueueSingleton::Instance()->Stop();
JobQueueSingleton::Release();
// OR, you can use JobQueue directly without the JobQueueSingleton wrapper class
// so you could have multiple instances of JobQueue
Главный поток получает уведомления таким вот образом:
// in the event table
EVT_COMMAND(wxID_ANY, wxEVT_CMD_JOB_STATUS, MyFrame::OnJobStatus)
void MyFrame::OnJobStatus(wxCommandEvent &e)
{
wxString msg;
msg << wxT("Job progress: Stage: ") << e.GetInt() << wxT(" Message: ") << e.GetString();
wxLogMessage(msg)
}
[/sourcecode]
Скачать исходный код
Читать обсуждение на wxForum