在 Qt 中,可以使用以下命令在特定线程中执行 lambda 或函子元呼叫发布。其实现方式如下:
创建一个 functoid 来包装要执行的函数:
将要执行的函数作为参数传递给 std: : 函数类为显示:
std::function<void()> myFunction = []() { // Code to be executed in the specified thread };
将元调用发布到指定线程:
使用 FunctorCallConsumer 命名空间中的 postMetaCall 函数将元调用发布到所需的线程。该函数接受一个线程指针和一个函数指针作为参数。
FunctorCallConsumer::postMetaCall(&myThread, myFunction);
QMetaObject::invokeMethod(&myThread, myFunction);
实现元调用事件消费者:
最后一步是实现一个 QEvent 子类,它将接收并执行元调用。 FunctorCallEvent 类可以定义如下:
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.
QCoreApplication::instance()->installEventFilter(new FunctorCallEventConsumer(&myThread));
示例:
这是一个完整的示例,演示如何在指定线程中执行 lambda:
#include <QtCore> class MyThread : public QThread { public: void run() override { // Execute the lambda in this thread 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); // Create a new thread MyThread thread; // Create a lambda to execute in the thread std::function<void()> lambda = []() { qDebug() << "Lambda executed in thread" << QThread::currentThread(); }; // Set the lambda on the thread thread.setLambda(lambda); // Start the thread thread.start(); return app.exec(); }
输出:
Lambda executed in thread QThread(0x7f8632802640, name = "MyThread")
以上是如何在特定的 Qt 线程中执行 Functor 或 Lambda?的详细内容。更多信息请关注PHP中文网其他相关文章!