我必须在C ++中使用线程在后台运行任务。实际上在代码中我必须使用curl发送多个HTTP请求,我不想使用主线程运行,因为它会使主线程被阻塞,直到任务完成。因此我希望每个http请求应该是这样的:
a)创建一个新线程b)在这个新线程上发送curl req c)一旦req / response完成,将响应/数据发送回主线程
在这个过程中,我希望主线程是免费的,并运行其他一些自己的任务。我是C ++和线程的新手,请告知如何实现这一点。
答案 0 :(得分: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中。
答案 1 :(得分:0)
您需要使用条件变量或自动或手动重置事件来通知主线程。当你启动了辅助线程时,你得到你的主线程等待这个条件变量,当辅助线程完成时,它发出标志,让主线程知道它完成了并且可以继续做它正在做的事情。
答案 2 :(得分:0)
如果你使用的是c ++ 11标准,我必须制作一个“主线程调用者”,它接受一个lambda代码并安排它在下次屏幕更新时调用主线程(总是在主线程上)。在内部,它使用lambda的向量,并在每次调用更新时将其排出。如果没有lambdas,则不会安排更新。我在iOS / Droid生产代码中广泛使用它。 你可以在这里得到它: https://github.com/radif/emjCCMainThreadCaller