簡體   English   中英

Qt moveToThread()vs我們使用每個時調用新線程

[英]Qt moveToThread() vs calling new thread when do we use each

我們什么時候在線程應用程序中使用每個函數調用。 給定兩個函數fun1()和fun2()在同一個類中定義處理數據讀/寫緩沖區(隊列操作)。 實現對這些的多線程。 我們必須在一個單獨的線程中運行這兩個函數。 現在假設第一個函數read在其線程的開頭被調用。

最好在第一個函數線程的開頭使用moveTothread(第二個線程)進行函數寫入

要么

在新線程類中定義第二個函數,並在第一個線程的開頭調用該線程。

像Piotr回答你應該看看他建議的鏈接。
據我了解你的問題,這應該可以解決你的問題。
這是該博客的簡化代碼:

class Producer  
{  
public:
    Producer();  

public slots:
    void produce()
    { //do whatever to retrieve the data
      //and then emit a produced signal with the data
      emit produced(data);
      //if no more data, emit a finished signal
      emit finished();
    }

signals:
    void produced(QByteArray *data);
    void finished();
};

class Consumer
{
public:
    Consumer();

public slots:
    void consume(QByteArray *data)
    {
       //process that data
       //when finished processing emit a consumed signal
       emit consumed();
       //if no data left in queue emit finished
       emit finished();
    }
};

int main(...)
{
    QCoreApplication app(...);

    Producer producer;
    Consumer consumer;

    producer.connect(&consumer, SIGNAL(consumed()), SLOT(produce()));
    consumer.connect(&producer, SIGNAL(produced(QByteArray *)), SLOT(consume(QByteArray *));

    QThread producerThread;
    QThread consumerThread;
    producer.moveToThread(&producerThread);
    consumer.moveToThread(&consumerThread);

    //when producer thread is started, start to produce
    producer.connect(&producerThread, SIGNAL(started()), SLOT(produce()));

    //when consumer and producer are finished, stop the threads
    consumerThread.connect(&consumer, SIGNAL(finished()), SLOT(quit()));
    producerThread.connect(&producer, SIGNAL(finished()), SLOT(quit()));

    producerThread.start();
    consumerThread.start();

    return app.exec();
}

使用moveToThread我們可以改變對象的線程親和性。 OP問的是我們如何在不同的線程中運行同一個類的兩個函數。

A類和兩個函數f1f2

class A
{
public:
    void f1();
    void f2(int i); 
    void run(); // shows how we can trigger f1 and f2 in different threads
}

Qt已經提供了一個在不同線程中運行函數的類,它被稱為QtConcurrentRun

QtConcurrent::run()函數在一個單獨的線程中運行一個函數。 該函數的返回值可通過QFuture API獲得。

觸發的函數可以是外部函數或成員函數。 所以在我們的情況下,如果我們想從對象本身在不同的線程中啟動f1f2 ,我們可以在run()run()以下操作

void run()
{
   // QFuture<void> because f1 is void 
   QFuture<void> future1 = QtConcurrent::run(this, &A::f1);
   int k = 5; // Concurrent run with arguments
   QFuture<void> future2 = QtConcurrent::run(this, &A::f2, k);
} 

類似地,您可以同時執行任何類的任何公共函數,例如

QImage image = ...;
QFuture<void> future = QtConcurrent::run(image, &QImage::invertPixels, QImage::InvertRgba);

A a;
QFuture<void> future1 = QtConcurrent::run(A, &A::f1);

注意兩個調用之間的區別:

QtConcurrent::run()也接受指向成員函數的指針。 第一個參數必須是const引用或指向該類實例的指針。 在調用const成員函數時,通過const引用傳遞是很有用的。 傳遞指針對於調用修改實例的非const成員函數很有用。

為了檢查並發執行的函數何時完成,您應該使用QFutureWatcher

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM