2009-09-17 60 views
6

在qt文檔中展示線程的唯一方法是繼承QThread,然後覆蓋它的run()方法。是否可以使用Qt線程而不繼承任何Qt對象?

class MyThread : public QThread 
{ 
public: 
    void run(); 
}; 

void MyThread::run() 
{ 
    QTcpSocket socket; 
    // connect QTcpSocket's signals somewhere meaningful 
    ... 
    socket.connectToHost(hostName, portNumber); 
    exec(); 
} 

我不知道是否有任何方式使用qt線程,而不從任何qt對象繼承?

+0

Qt文檔和答案已過時。 Qt強烈鼓勵現在使用QThread的另一種方式:http://doc.qt.io/qt-5/qthread.html – ymoreau 2017-08-23 14:18:07

回答

10

您可以使用多線程不自QObject繼承與QtConcurrent :: run()中:

QFuture QtConcurrent ::運行(功能函數,...)在一個單獨的線程
奔跑功能。該線程取自全局QThreadPool。請注意,該函數可能不會立即運行;該函數將僅在線程可用時運行。

+0

我知道這是一個古老的主題,但人們可能會在這裏結束,所以我認爲它值得一提的以下鏈接: - http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/ - http://woboq.com/blog/qthread-you-were- not-doing-so-wrong.html - http://qt-project.org/wiki/Threads_Events_QObjects – x29a 2013-07-25 14:54:08

3

QThread本身是從QObject派生的。您需要重寫它的run方法才能使用它,因此您必須從QObject繼承才能使用QThread。

爲什麼你不想從QObject繼承?

2

如果你不希望繼承QThread,你可以創建一個繼承QThread並將你的對象作爲參數的包裝器,通過一個IRunnable接口(你可以讓你的線程類繼承)。