C++ MFC跟踪事件调用

C++ MFC跟踪事件调用,c++,windows,multithreading,mfc,C++,Windows,Multithreading,Mfc,我有一个主线程和另一个执行某些处理的工作线程。我当前正在从主线程发送事件信号,工作线程应该响应这些事件。在我的主线程中,我有以下内容: frameNo = 1; for (int j = 0; j < 10; j++) { frameNo++; tEvent->SetEvent(); } 在我的工作线程中,我有以下内容: int RThread::Run() { while (1) { WaitForSingleObject(myEve

我有一个主线程和另一个执行某些处理的工作线程。我当前正在从主线程发送事件信号,工作线程应该响应这些事件。在我的主线程中,我有以下内容:

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,尽管它可能有点落后


我怎样才能记下活动设置了多少次?我想根本不使用事件,而是使用队列将变量推送到,而工作线程只是从队列中取出。但是,如果我使用该队列,我是否需要队列周围的一些关键部分,因为两个线程都在修改它?

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

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

父母亲 生成帧 信号子帧准备就绪 等待来自已处理帧的子帧的信号 重复 小孩 等待来自家长的信号 过程框架 信号父帧已被处理 重复 然而,除非您死心塌地地使用线程,否则这似乎是对线程的拙劣使用。线程的要点是并行运行,但在这种情况下,您似乎希望串行执行,因此您最好使用单个线程


是的,您也可以将数据排队等待子线程处理。是的,这通常涉及互斥。但是,如果您正在进行多线程编程,线程安全队列是一件好事。例如:

使用和同步线程乒乓操作。仅仅因为你使用的是28岁的MFC,并不意味着你不能使用现代的C++习语。这一功能自C++11以来就一直存在,它使线程同步不再费力。C++11共享了智能指针,比如,并为我们提供了无泄漏的动态内存管理,等等。记住,C++很快就会变成40,而且没有迹象表明它的进化正在减弱,FX,C++ 20将带给我们Coroutines和。今年,ISO C++主席萨特报道去年有超过200名学术论文提交,比前一年增加了125。如果您愿意学习一些新知识,或者您的经理会让您学习,MFC可以成为您的受益者。

非常感谢您的评论!我只是想说几句——我正在使用Windows MFC,所以我只想确保我的主GUI线程仍然能够处理任何用户界面事件。你还认为线程的使用不好吗?在过去,如果使用单个线程,GUI线程将太忙,无法处理任何其他用户交互。最后,如果我使用队列,我不需要使用任何事件,对吗?它将只是子线程从中读取的队列。您需要类似于队列的东西。看一看我的文章,一个完全不同的实现将是使用APCs。检查QueueUserAPC函数文档。它实际上实现了一种队列机制。在线程例程中,通常运行一个循环:whileTRUE{SleepExINFINITE,TRUE;}。除非队列中有APC请求,否则线程将处于休眠状态。在许多情况下使用它,效果非常好。不再需要同步。PASS FrAMENO作为APC过程参数。但是,其他成员关于多线程使用不当的评论是值得考虑的。如果您只想在另一个线程中处理帧,而该线程将按顺序处理所有帧,那么为什么要在UI线程中安排帧处理请求,而工作线程处理每个帧?为什么不干脆把所有这些放在工作线程中呢?@ConstantineGeorgiou我想我明白你的意思了,但我使用的是Windows MFC框架,我从消息映射中获取消息。我无法访问实际发送消息的代码。你是说,如果我有权访问发送消息的代码,我可以在不同的线程中执行消息,对吗?我没有说任何关于Windows消息的内容。我认为您对我上面提到的消息、事件和APC有些困惑。APC是一种将请求后处理到线程的机制。如何在另一个thead中执行消息?Windows消息被发送到拥有窗口的线程并由该线程处理,该线程是主UI线程。我在第二条评论中说的是,为什么不把所有的帧处理代码都放在子线程RThread::Run中呢?不需要任何类型的同步,除了更新UI项。