2011-10-24 46 views
0

我有一个C++应用程序,其具有以下结构:C++多线程和活动

AAA级:有一些功能和打开一个线程其中之一的功能。 BBB类:有一些功能,其中一个功能可以打开一个线程。 CCC类:呼叫AAA和BBB,它们在其功能中都处于内部打开状态。

在某些情况下,我在AAA线程中知道某些我想要退出的步骤并通知BBB和CCC。因为我在一个线程(Win32Thread)中,它是一个无效函数,我在线程中运行,所以我不能将值返回给CCC。

我是C++新手(来自C#领域),不知道如何做到这一点。 (通知) 注:我不能改变这种结构。我只能在类的功能上添加或做些微小的改动。这是一个运行在脚本和大代码上的大过程。

有什么想法?请不要肮脏的人,如果有可能:)

添加样本将非常有帮助。

回答

0

我不太了解您的问题,有点过于通用。 而你没有指定使用什么样的多线程库。

要在线程之间发送消息,通常会使用消息队列,并使用等待句柄,锁定和信号量来同步它们。

当然,您需要一个安全的多线程队列来在线程间发送消息。

一种可能的解决方案:

如果线程A需要发送的消息由入队入线程B队列,将其唤醒,如果它是处于空闲状态通过例如等待事件线程B。 线程B收到消息并响应在A队列中发送另一条消息。

另一种可能的解决方案:

线程A需要将消息发送到线程B和需要的回复,直到回复没有接收阻塞线程A。 线程A在线程B队列中排队消息,消息对象可以在函数堆栈中。然后,如果线程B处于空闲状态,然后通过等待句柄或信号灯进入等待状态,则唤醒线程B. 线程B在将消息出队时,将线程A中的对象写回来,并从线程A的等待状态中唤醒线程A. 对象字段应该被标记为易失性的,因为它被两个线程读取\写入。 然后,线程A使用存储在消息对象中的值并从堆栈中删除对象。

听起来很复杂,但是实现起来很简单。

如果您在Windows操作系统中,您可以使用Windows消息队列创建隐形消息窗口,每个线程一个。第一种情况使用PostMessage,第二种情况使用SendMessage。

0

如果您不害怕Windows特定的解决方案:请致电PeekMessage()BBB线程。这将为它创建一个Windows消息队列。 (主线程已经有一个)。现在,您可以使用SendMessage()将消息从AAA发送到其他主题。请注意,您正在发送到线程,而不是类。任何拨打GetMessage()的电话都会看到您的信息。

0

我用于线程的典型设计是一个线程函数,它传递一个包含它的类的实例(它也包含该线程的实例变量)。这是你的情况吗?该线程是否有传入它的类的某个实例?如果他们这样做,那么只需跟踪来自外部的人,并将BOOL属性标记为何时停止。在线程的主循环中,您只需检查标志以查看是否有任何业务再次循环。这是退出线程的唯一干净方式。