C++ MFC 跟踪事件调用

C++ MFC Keeping Track of Event Calls

本文关键字:调用 事件 跟踪 MFC C++      更新时间:2023-10-16

我有一个主线程和另一个执行一些处理的工作线程。我目前正在向工作线程应响应的主线程发出信号。在我的主线程中,我有以下内容:

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,即使它可能有点落后。

如何以某种方式跟踪事件的设置次数?我正在考虑根本不使用事件,而只是使用队列将变量推送到,而工作线程只是从队列中获取。但是,如果我使用该队列,由于两个线程都在修改它,我是否需要在队列周围设置某种关键部分?

如果要确保子线程单独看到每个帧,则必须添加同步以确保父线程和子线程之间的严格更改。

例如,您可以执行以下操作:

父母

  1. 生成帧
  2. 信号子帧已准备就绪
  3. 等待来自子帧已处理的信号
  4. 重复

孩子

  1. 等待来自父级的信号
  2. 工艺框架
  3. 向父级发出帧已处理的信号
  4. 重复

但是,除非您死心塌地地使用线程,否则这似乎是对线程的不良使用。线程的要点是并发运行,但在这种情况下,您似乎想要串行执行,因此您不妨使用单个线程。

是的,您也可以将数据排队等待子线程处理。是的,这通常涉及互斥锁。但是,如果您正在进行多线程编程,那么线程安全队列无论如何都是一件好事。例如: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 可以成为受益者(或者您的经理会让您(。