Dalam Qt, adalah mungkin untuk melaksanakan lambda atau functor dalam thread tertentu menggunakan pengeposan metacall. Begini caranya:
Buat functoid untuk membalut fungsi yang hendak dilaksanakan:
Lepaskan fungsi yang akan dilaksanakan sebagai argumen kepada std: : kelas fungsi sebagai ditunjukkan:
std::function<void()> myFunction = []() { // Code to be executed in the specified thread };
Siarkan metacall ke urutan yang ditentukan:
Gunakan fungsi postMetaCall dari ruang nama FunctorCallConsumer untuk menyiarkan metacall ke urutan yang dikehendaki . Fungsi ini mengambil penuding benang dan penuding fungsi sebagai argumen.
FunctorCallConsumer::postMetaCall(&myThread, myFunction);
QMetaObject::invokeMethod(&myThread, myFunction);
Melaksanakan pengguna acara metacall:
Langkah terakhir ialah melaksanakan subkelas QEvent yang akan menerima dan melaksanakan metacall. Kelas FunctorCallEvent boleh ditakrifkan seperti berikut:
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; };
Sambungkan pengguna acara ke urutan:
Setelah kelas FunctorCallEvent telah ditentukan, sambungkan ia ke gelung acara benang yang ditentukan menggunakan QCoreApplication::installEventFilter.
QCoreApplication::instance()->installEventFilter(new FunctorCallEventConsumer(&myThread));
Contoh:
Berikut ialah contoh lengkap yang menunjukkan cara untuk melaksanakan lambda dalam urutan tertentu:
#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(); }
Output:
Lambda executed in thread QThread(0x7f8632802640, name = "MyThread")
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Functor atau Lambda dalam Benang Qt Tertentu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!