我有一个有趣的问题。使用 Qt 处理 C++ 项目。跨平台项目,但在 Win 上开发。
我有一个 C 风格的回调函数。它必须是C风格,我别无选择。在 C 风格的回调函数中完成的工作是重要且时间敏感的。因此,我有一些 Qthread 线程可以帮助处理工作量。
我没有使用 Qt 线程的运行方案,而是按照 QThread 文档底部的说明使用 QThreads。http://qt-project.org/doc/qt-5.0/qthread.html#wait
为了清楚起见,我这样使用 QThread:
QThread *thread = new QThread;
Worker *worker = new Worker;
worker->moveToThread(thread);
thread->start();
QMetaObject::invokeMethod(worker, "doWork", Qt::QueuedConnection);
线程是在应用程序开始时创建的,并由 QMetaObject::invokeMethod 提供。
挑战是在 QThread 线程完成它们的工作之前,不让 C 回调函数做“任何事情”(以一种有效的方式)。我想让回调函数等待它不会与工作线程竞争 cpu(所以没有繁忙的虚拟循环)。我也可以使用 sleep() 之类的东西,但这效率不高,因为如果线程“提前”完成,就会浪费睡眠。我想从工作人员那里发送一个信号,但问题是我的回调是一个 C 函数,所以我看不到它如何捕获 Qt 信号。