【发布时间】:2012-04-13 18:06:32
【问题描述】:
我有一个有趣的问题。使用 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 信号。
【问题讨论】:
-
你不能用 Qt 类包装 C 函数并在那里捕获信号吗?
-
不,我不能。 C 函数不仅仅是一个 C 函数,它还是一个回调函数。库的一部分。我无法改变它的本质,我只能实现它的身体。我无法控制什么/谁调用回调,我需要将其保留为 C 回调函数。
标签: qt