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
Lepaskan: 2024-12-17 04:07:25
asal
743 orang telah melayarinya

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
    };
    Salin selepas log masuk
  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);
    Salin selepas log masuk
    • Nota:
      Dalam Qt 5.10 dan kemudian, anda boleh terus menggunakan QMetaObject::invokeMethod untuk melaksanakan fungsi dalam yang ditentukan benang:
    QMetaObject::invokeMethod(&myThread, myFunction);
    Salin selepas log masuk
  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;
    };
    
    Salin selepas log masuk
  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));
    Salin selepas log masuk

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();
}
Salin selepas log masuk

Output:

Lambda executed in thread QThread(0x7f8632802640, name = "MyThread")
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan