繁体   English   中英

像Windows的:: SendMessage / :: PostMessage一样传递C ++消息

[英]C++ message passing like Windows's ::SendMessage / ::PostMessage

我正在重构程序,以减少对Windows特定结构的依赖。 线程模型是“传统的” Windows GUI模型:只有一个“主” GUI线程仅执行非常短的操作,以保持GUI的响应速度。 所有更长的任务都在“工人”线程中完成。 所有辅助线程仅与gui线程通信,它们通过:: SendMessage和:: PostMessage进行通信(对于不熟悉Windows API的用户,SendMessage被阻止,而PostMessage不被阻止)。 “通知”样式的消息,例如“嘿,我已经完成处理了”,或者所有参数都可以装入2个32位值(Send / PostMessage的参数)的消息与PostMessage一起发送,因为没有数据访问权限需要同步; 对于必须传递大量数据的消息,请使用SendMessage,然后gui线程(快速)在执行“真实”处理之前将其所需的所有内容复制(或将“真实”处理传递给另一个工作线程)。 这样,就不会同时访问同一数据。 它有一些限制,但到目前为止对我们有用。 主要优点是它是如此简单的模型,您几乎不必费劲思考可能发生的事情或进行显式同步,因为永远不会共享访问数据的权限。

我要解除的“唯一”限制是该模型仅用于单向通信:它是从工作程序到gui线程的。 到目前为止,它已经为我们的目的所用,但是我想转到一个模型,在该模型中,所有线程都是相等的,并且任何线程都可以将消息“发布”到任何其他双向线程; 然后,在此之上,我想构建一些东西来检查“工作线程”仅与“主线程”通信,反之亦然; 彼此之间永远不要“工人线”。 这样,将来我们将具有灵活性,可以在线程确实需要进行n:n交流的其他用例中重用该机制。

所以现在我的问题是:如何使用c ++ 11或boost线程库复制此行为? 理想情况下,我将有一个全局函数或单例成员,可以从任何线程中调用它,并以第一个参数的形式来“调用”某种线程的ID,也许是某种“消息ID”(消息)必须先注册,就像Win32中的RegisterUserMessage()一样,并指定特定于消息的void *。 接收方将负责投射和解释该消息。 然后以某种方式在“接收”线程的上下文中调用消息处理方法。

所以我在想也许其他类派生自该类的“ ThreadBase”基类。 'ThreadBase'将提供一个纯虚函数'HandleMessage(unsigned int msg_id,void * data)'左右。 也许这个“ ThreadBase”本身会从std :: thread派生出来? 还是有std :: thread成员? 然后在(对于此示例)main()中,我将执行以下操作:

ThreadManager::RegisterMessage(1234);  // 'Thread1 is done'
Thread1 t1(1); // Thread1 and Thread2 both derived from 'ThreadBase'
Thread2 t2(2); // Construction of t1 and t2 would immediately start the thread; alternatively they could have a Run() member?

然后从t1的任何地方都可以做:

MyData data;
ThreadManager::SendMessage(2, 1234, (void*)&data);

这将使用参数'1234'和'&data'调用Thread2 :: HandleMessage()。

我希望我在这里有道理-我想从我的问题的措辞来看,很明显,我对win32 API以外的多线程不是很熟悉。 这个想法有道理吗? 我忽略的缺点? 如何使用线程原语实现这一点? 谢谢。

您的问题显然不适合SO问题格式;),但我不支持您。

我将尝试解释一些有关C ++中的线程模型的信息。 要记住的第一件事是,它实际上是在Posix线程上建模的。 因此,您可以在此处找到Posix的东西,但不能找到Windows专用的东西。 特别是,这意味着它缺少对消息传递的任何内置支持。 您可以拥有的关闭条件变量,但是您只能等待单个条件变量,而不能进行多路复用。 要使用消息传递,您需要实现自己的消息队列,或使用第三方库(boost当然拥有一个,以及一堆其他库)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM