Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用在主线程上工作的方法_C++_Multithreading_Boost - Fatal编程技术网

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

C++ 调用在主线程上工作的方法,c++,multithreading,boost,C++,Multithreading,Boost,我有两条不同的线。第一个是必须处理gui操作的主线程。第二个是侦听相关tcp端口的网络线程。我需要网络线程以在主线程中运行的方式调用方法。如何在不使用消息队列机制的情况下实现这一点?您必须告诉主线程上运行的代码它需要调用您的方法。无论您如何实现这一点,基本上都会有某种消息队列。您必须更具体地说明您的实际需求,以便我们可以建议适合您的情况的消息队列机制。在您的情况下,我要做的是告诉另一个线程在其事件队列上安排一个函数。该函数的参数与发送的函数绑定在一起 例如,在网络代码中: int result

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

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

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

例如,在网络代码中:

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::函数传递到回调中。

您希望如何在没有消息队列的另一个线程上生成事件,以及为什么不希望使用消息队列?您必须向主线程发出信号,以某种方式调用这些方法。当GUI线程不执行GUI操作时,它会做什么?它等待什么?主线程运行3d图形更新方法。因此,我不希望网络消息在主线程下处理,因为这会降低图形性能…@Duck:main thread应该只绘制3d图形并执行gui操作,但是,网络消息必须在网络自己的线程下处理。例如,如果收到聊天信息,它将由网络线程处理,并由主线程显示。对,但它们是独立的线程。main负责gui,您通常不希望网络线程乱来。因此,让网络线程(队列、管道、任何事件机制)发出信号,表明存在需要gui更新的内容。你担心阻塞吗?