如何在一个单独的线程中创建每个多任务?

时间:2018-05-09 14:15:41

标签: c++ multithreading wxwidgets

我有两种静态方法:

  • bool getPicture(const std::string url, const std::string keywords ="")
  • bool showPicture(wxStaticBitmap *viewer)

这些方法每个人都执行单独的任务,因此,我希望每个方法都在一个单独的线程中执行。

#include <wx/thread.h>

// Declaration

class CThread : public wxThread {
public:
    CThread() = default;
    ~CThread() = default;
    void *Entry();
};

// Implementation

void* CThread::Entry() {
    CPublic::getPicture(mainFrm::getInstance()->targetURL, CPublic::getConfigItem("settings/keywords").ToStdString());
    // CPublic::showPicture(mainFrm::getInstance()->viewer_btmp);
    return 0;
}

// Create an instance

wxThread *th = new CThread();
th->Create();
th->Run();

正如您在上面的代码中看到的那样,每个线程类中都有一个Entry()方法,因此,我想要另一个Entry()方法将我的下一个方法showPicture()放入其中。

我是否必须创建另一个具有另一个 Entry() 方法的类来将我的 showPicture() 方法放入其中,在另一个单独的线程中执行还是以另一种方式执行?

1 个答案:

答案 0 :(得分:1)

快速回答:
所有类的实例(wxThread是一个类)共享其方法。因此,如果您想要一个不同的Entry(),则需要一个新的wxThread派生类。

有关多线程的建议:
虽然可以在辅助线程中执行getPicture(),但是应该在主线程中执行showPicture(),因为它是绘制到窗口中的正确位置。强烈建议所有GUI内容在主线程中仅 。 很少见的是在辅助线程中使用OpenGL而不是通过OS命令绘制。

关键是辅助线程向主线程发布消息,告诉“我已经完成,图像可用”。
新数据(图像处理)可以放在主线程(例如要绘制它的窗口)可以读取它的位置。
使用getPicture()阻止任何其他线程在工作线程(wxCriticalSectionLocker)正在写入时访问数据。

wxWidgets docsmore wxWidgets doc的更多信息以及随wxWidgets分发提供的thread示例。