При работе с потоками часто приходится делать кучу однотипных задач: создавать класс, производный от 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