这种没办法,只能丢到线程池里面去搞。用协程+线程池总比多线程强吧。
如果这些程序库有回调函数的话,还可以转成协程阻塞函数。
我实现过一个版本。
template<typename Result>
Result qAwait(Func asyncFunc)
{
shared_ptr<Event> event(new Event);
auto callback = [event](Result r) { event->set(r); };
asyncFunc(callback);
return event->wait();
}
上面是伪代码。但是通过 Event 这个工具类,就可以把任何异步函数转成同步的。懂 win32api 和 python 的应该都知道这个 Event 是个啥我这里就不细说了。
于是后续就可以这样调用:
auto r = qAwait(mysql_connect, args...);
我实现成功的 Qt 版本。使用方式是这样的:
animation1->start();
qAwait(animation1, SIGNAL(finished());
button->show();
qAwait(button, SIGNAL(clicked());
button->hide();
animation2->start();
于是我可以在协程里面阻塞等待用户的点击事件再继续。以上代码意思很清楚吧,先执行动画1,结束之后等待用户点一下按钮,再继续执行动画2.
【 在 stub 的大作中提到: 】
: 使用什么协程库呢, 使用协程, 如果想完全不堵塞, 还需要实现各种对应的协程客户端, 比如http, grpc, redis, mongo, mysql等, 如果不实现对应的协程客户端, 协程的性能是大打折扣的
--
修改:hgoldfish FROM 27.152.110.*
FROM 27.152.110.*