C++ MFC 跟踪事件调用
C++ MFC Keeping Track of Event Calls
我有一个主线程和另一个执行一些处理的工作线程。我目前正在向工作线程应响应的主线程发出信号。在我的主线程中,我有以下内容:
frameNo = 1;
for (int j = 0; j < 10; j++) {
frameNo++;
tEvent->SetEvent();
}
在我的工作线程中,我有这个:
int RThread::Run()
{
while (1) {
WaitForSingleObject(myEvent->m_hObject, INFINITE);
std::cout << "Event signalled!" << std::endl;
std::cout << "Frame number is: " + std::string(obj->frameNo) << std::endl;
}
return 0;
}
截至目前,工作线程仅打印 frameNo 等于 11,我假设是因为主线程迭代得如此之快,以至于工作线程只有在 frameNo 已经增加到 11 时才达到该阶段。结果,它缺少数字 1-10。
不过,我不想错过数字1-10,即使它可能有点落后。
如何以某种方式跟踪事件的设置次数?我正在考虑根本不使用事件,而只是使用队列将变量推送到,而工作线程只是从队列中获取。但是,如果我使用该队列,由于两个线程都在修改它,我是否需要在队列周围设置某种关键部分?
如果要确保子线程单独看到每个帧,则必须添加同步以确保父线程和子线程之间的严格更改。
例如,您可以执行以下操作:
父母
- 生成帧
- 信号子帧已准备就绪
- 等待来自子帧已处理的信号
- 重复
孩子
- 等待来自父级的信号
- 工艺框架
- 向父级发出帧已处理的信号
- 重复
但是,除非您死心塌地地使用线程,否则这似乎是对线程的不良使用。线程的要点是并发运行,但在这种情况下,您似乎想要串行执行,因此您不妨使用单个线程。
是的,您也可以将数据排队等待子线程处理。是的,这通常涉及互斥锁。但是,如果您正在进行多线程编程,那么线程安全队列无论如何都是一件好事。例如:https://stackoverflow.com/a/2375370/179910
使用 std::p romise 和 std::future 来同步您的线程乒乓球动作。仅仅因为您使用的是 28 岁的 MFC,并不意味着您不能使用现代C++习语。此功能自 C++11 以来一直存在,并消除了线程同步的汗水。C++11 共享智能指针,如 std::shared_ptr 和 std::unique_ptr 为我们提供了无泄漏的动态内存管理,等等。请记住,C++即将满 40 岁,并且没有任何迹象表明它的演变正在减弱,fx、C++20 将为我们带来概念、协程和模块。今年,ISO C++主席赫伯·萨特(Herb Sutter(报告说,去年有超过200名学术专家提交了论文,高于前一年的125篇。如果您愿意学习新东西,MFC 可以成为受益者(或者您的经理会让您(。
- C++ MFC 跟踪事件调用
- Q维德格特关闭事件(..)未使用 QProcess::terminate() 调用
- 如何从qml Keys.oPressed调用qt keyPressEvent(QKeyEvent*事件)
- 事件上的waitforsingleobject如果调用rssetscissercrect,会导致访问违规
- 在浏览器中创建由 en 事件调用的 C# 窗口服务
- 如何在从主窗口事件处理程序调用后在子窗口中创建按钮
- 直接调用事件处理程序
- 调用 wxListCtrl::EditLabel (索引) 时无法捕获EVT_LIST_BEGIN_LABEL_EDIT事件
- 调用 Director::getInstance()->popScene() 后,调度停止以触发事件
- 对事件循环中槽的调用排队,由Qt按向后顺序处理
- 是否可以在不调用 QApplication::exec() 的情况下创建本地事件循环
- 声明在 Qt 中发生鼠标事件时调用的函数
- 我可以在不手动调整Qt大小的情况下调用调整大小事件吗?
- 如何对表中的插入事件调用 exe
- Qt从其他线程向事件循环添加函数调用
- QGraphicsScene一直在调用QGraphicsItem绘制事件
- 在插槽中调用QDialog::exec是否会阻塞主事件循环
- 如何从本机组件向C#/XAML组件进行函数调用或触发事件
- 从c++调用c#事件
- 调用"事件:<float>:通知(NULL, const double&)"没有匹配函数|