c++ - 如何在单独的线程中创建多个任务?
问题描述
我有两个静态方法:
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()
方法放入其中,以便在另一个单独的线程中执行,还是有另一种方式?
解决方案
快速回答:
一个类的所有实例(wxThread 是一个类)共享它的方法。所以如果你想要一个不同的Entry()
,你需要一个新的 wxThread 派生类。
关于多线程的建议:
虽然getPicture()
可以在辅助线程showPicture()
中执行,但应该在主线程中执行,因为它是绘制到窗口中的正确位置。强烈建议所有 GUI 内容仅在主线程中完成。
一个罕见的期望是在辅助线程中使用 OpenGL,而不是通过操作系统命令进行绘制。
关键是辅助线程向主线程发布一条消息,告诉“我完成了,图像可用”。
新数据(处理过的图像)可以放在主线程(例如,将要绘制它的窗口)可以读取它的位置。
使用 .防止任何其他线程在工作线程(用于getPicture()
)正在写入时访问数据wxCriticalSectionLocker
。
更多信息在wxWidgets 文档,更多 wxWidgets 文档和 wxWidgets 分发提供的thread
示例。
推荐阅读
- spring-boot - Spring security : OAuth 相关类 -AuthorizationServerTokenServices , Oauth2AccessToken 不可用
- php - 无法修改标头信息 - 已由提到的行以 Html 开头发送的标头
- spring - SQLIntegrityConstraintViolationException 导致 Spring 事务回滚
- algorithm - 最坏情况、大 o、大 theta 和大 omega
- java - 如何重复参数化的 Junit 5 测试?
- python - 根据列表的值查找数据框中是否存在连续的 3 行或更多行
- algorithm - 将一组大小为 N 的集合分成 M 个组,这些组的总和之间的差异最小
- python - 缺少数据 Plotly Express px.data
- android - How to create a compound view behaving like one component is ViewGroup in layout.xml
- jenkins - 无法在 Jenkins 中执行任何 sudo 命令