调用在主线程上工作的方法

时间:2012-01-29 01:59:48

标签: c++ multithreading boost

我有两个不同的主题。第一个是必须处理gui操作的主线程。第二个是侦听相关tcp端口的网络线程。我需要网络线程以他们将在主线程中运行的方式调用方法。如何在不使用消息队列机制的情况下实现此目的?

2 个答案:

答案 0 :(得分:3)

我在你的情况下如何做是告诉另一个线程在其事件队列上安排一个函数。该函数的参数与发送的函数绑定。

例如在网络代码中:

int result = doWork();
otherThreadsEventLoop.scheduleFunction(drawResult,result);

所有GUI框架和大多数网络框架都允许您这样做。

  • 如果您使用的是qt,那么您将使用QMetaObject :: invokeMethod。
  • 如果您使用的是gtk,那么q_idle_add就是您要使用的。
  • 如果您使用的是boost :: asio,那么您将使用io_service.post。
  • 如果您正在使用libevent,那么您将使用event_base_once。

一个问题可能是仅为您提供C回调的库的附加参数的绑定。我的建议是编写一个“包装器”函数,它允许你将std ::函数传递给回调函数。

答案 1 :(得分:2)

你必须告诉在主线程上运行的代码,它需要调用你的方法。无论你如何实现它,你基本上都会有某种消息队列。您必须更具体地了解您的实际要求,以便我们建议适合您案例的消息队列机制。