2

我必须使用 C++ 中的线程在后台运行任务。实际上在代码中,我必须使用 curl 发送多个 HTTP 请求,并且我不想使用主线程运行,因为它会使主线程阻塞,直到任务完成。因此,我希望每个 http 请求都应该是这样的:

a) 创建一个新线程 b) 在这个新线程上发送 curl 请求 c) 一旦请求/响应完成,将响应/数据发送回主线程

在此过程中,我希望主线程空闲并运行其他一些自己的任务。我是 C++ 和线程的新手,请告知如何实现这一点。

4

3 回答 3

1

如果您希望在工作线程完成后立即通知主线程,那么听起来您需要在主线程中有一个消息处理循环。

我只是在想这可以像 WinAPI 中的窗口过程一样实现。沿着这些思路。

cEvent event;
while( true )
{
  event = GetNextEvent();
  if( event.GetType() == APPQUIT )
  {
    break;
  }
  if( event.GetType() == SENDHHPTREQUEST )
  {
    // Create worker thread etc.
  }
  else if( event.GetType() == HTTPREQUESTCOMPLETED )
  {
    // Process HTTP request resuts.
  }
  ...
}

工作线程需要一种将事件发送到主线程的方法。当然,从消息队列中添加、删除事件必须是线程安全的,即使用互斥锁进行保护。我猜想创建请求或处理请求结果所需的所有数据都需要以某种方式打包到 cEvent 中。

于 2012-12-21T08:51:45.890 回答
0

如果您使用的是 c++11 标准,我必须制作一个“主线程调用程序”,它需要一个 lambda 代码并安排它在下次屏幕更新时在主线程上调用(始终在主线程上)。在内部,它使用一个 lambda 向量,并在每次调用 update 时将其耗尽。如果没有 lambda,则不安排更新。我在我的 iOS/Droid 生产代码中广泛使用它。你可以在这里得到它: https ://github.com/radif/emjCCMainThreadCaller

于 2013-03-02T08:00:00.913 回答
0

您需要使用条件变量或自动或手动重置事件来通知您的主线程。当你启动你的辅助线程时,你让你的主线程等待这个条件变量,当辅助线程完成时,它发出一个标志,让主线程知道它已经完成并且可以继续做它正在做的事情。

于 2012-12-21T09:13:01.160 回答