如何在 Qt 中的给定线程中执行函子或 lambda
在 Qt 中,可以使用以下命令在特定线程中执行 lambda 或函子元呼叫发布。其实现方式如下:
-
创建一个 functoid 来包装要执行的函数:
将要执行的函数作为参数传递给 std: : 函数类为显示:
1 2 3 | std:: function <void()> myFunction = []() {
};
|
登录后复制
-
将元调用发布到指定线程:
使用 FunctorCallConsumer 命名空间中的 postMetaCall 函数将元调用发布到所需的线程。该函数接受一个线程指针和一个函数指针作为参数。
1 | FunctorCallConsumer::postMetaCall(&myThread, myFunction);
|
登录后复制
-
注意:
在Qt 5.10及更高版本中,可以直接使用QMetaObject::invokeMethod在指定的位置执行一个函数thread:
1 | QMetaObject::invokeMethod(&myThread, myFunction);
|
登录后复制
-
实现元调用事件消费者:
最后一步是实现一个 QEvent 子类,它将接收并执行元调用。 FunctorCallEvent 类可以定义如下:
1 2 3 4 5 6 7 8 | class FunctorCallEvent : public QEvent {
public :
FunctorCallEvent(std:: function <void()> fun) : QEvent(QEvent::None), m_fun(fun) {}
void execute() { m_fun(); }
private :
std:: function <void()> m_fun;
};
|
登录后复制
-
将事件使用者连接到线程:
定义 FunctorCallEvent 类后,连接使用它到指定线程的事件循环QCoreApplication::installEventFilter.
1 | QCoreApplication::instance()->installEventFilter( new FunctorCallEventConsumer(&myThread));
|
登录后复制
示例:
这是一个完整的示例,演示如何在指定线程中执行 lambda:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | # include <QtCore>
class MyThread : public QThread {
public :
void run() override {
m_lambda();
}
void setLambda(std:: function <void()> lambda) {
m_lambda = lambda;
}
private :
std:: function <void()> m_lambda;
};
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
MyThread thread;
std:: function <void()> lambda = []() {
qDebug() << "Lambda executed in thread" << QThread::currentThread();
};
thread.setLambda(lambda);
thread.start();
return app. exec ();
}
|
登录后复制
输出:
1 | Lambda executed in thread QThread(0x7f8632802640, name = "MyThread" )
|
登录后复制
以上是如何在特定的 Qt 线程中执行 Functor 或 Lambda?的详细内容。更多信息请关注PHP中文网其他相关文章!