Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Melaksanakan Functor atau Lambda dalam Benang Qt Tertentu?

Bagaimana untuk Melaksanakan Functor atau Lambda dalam Benang Qt Tertentu?

Linda Hamilton
Linda Hamiltonasal
2024-12-17 04:07:25796semak imbas

How to Execute a Functor or Lambda in a Specific Qt Thread?

Cara melaksanakan functor atau lambda dalam thread tertentu dalam Qt

Dalam Qt, adalah mungkin untuk melaksanakan lambda atau functor dalam thread tertentu menggunakan pengeposan metacall. Begini caranya:

  1. 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
    };
  2. 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);
    • Nota:
      Dalam Qt 5.10 dan kemudian, anda boleh terus menggunakan QMetaObject::invokeMethod untuk melaksanakan fungsi dalam yang ditentukan benang:
    QMetaObject::invokeMethod(&myThread, myFunction);
  3. 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;
    };
    
  4. 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn