Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在一个单独的线程中创建多个任务?_C++_Multithreading_Wxwidgets - Fatal编程技术网

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

C++ 如何在一个单独的线程中创建多个任务?,c++,multithreading,wxwidgets,C++,Multithreading,Wxwidgets,我有两种静态方法: bool getPictureconst std::string url,const std::string关键字= bool showPicturewxStaticBitmap*查看器 这些方法每个都执行单独的任务,因此,我希望每个方法都在单独的线程中执行 #include <wx/thread.h> // Declaration class CThread : public wxThread { public: CThread() = defaul

我有两种静态方法:

bool getPictureconst std::string url,const std::string关键字= bool showPicturewxStaticBitmap*查看器 这些方法每个都执行单独的任务,因此,我希望每个方法都在单独的线程中执行

#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方法放入其中,并在另一个单独的线程中执行,还是有其他方法?

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

关于多线程的建议: 虽然getPicture可以在辅助线程中执行,但showPicture应该在主线程中执行,因为它是绘制窗口的正确位置。强烈建议只在主线程中完成所有GUI工作。 很少有人期望在辅助线程中使用OpenGL,而不是通过操作系统命令进行绘图

关键是,次线程向主线程发布一条消息,告诉我完成了,映像可用。 处理后的新数据图像可以放置在主线程(例如,将绘制它的窗口)可以读取它的位置。 使用wxCriticalSectionLocker,防止getPicture的工作线程在写入时任何其他线程访问数据


更多信息,请访问wxWidgets发行版提供的threadsample。

可能有助于解决您的问题。问题是,次线程向主线程发布消息,告知我完成了,图像可用。我如何知道线程已经完成任务并准备就绪?@LionKing在次线程中,getPicture结束后,在退出EntryAbout之前发布消息,虽然getPicture可以在次线程中执行,但showPicture应该在主线程中执行,因为它是绘制窗口的正确位置。将showPicture放在主窗口中,并将getPicture放在线程中时,结果是showPicture不显示当前图像,而是显示previos图像该窗口必须具有一个成员函数来处理从次线程接收到的消息。使用在此函数中,您将调用showPictureUse绑定。将使用什么类型的事件?