QT使用多線程的兩種方法

兩種方法:

  • 繼承QThread類,重寫run方法(QT4.8之前使用)
  • 自定義一個繼承QObject的類轉移到Thread中。和線程的交互通過信號和槽(實際上其實是通過事件)聯繫,QT4.8之後,官方建議這種方法)

爲什麼使用線程:?
舉個例子:如果我們在寫GUI程序的時候,如果某處的數據,計算比較複雜,當前主線程就會卡在這裏,在具體表現就是界面會卡住。所以在這個時候多線程就起到了關鍵的作用, 我們將複雜的邏輯運算交給線程,由線程在後臺處理。(注意:線程不能操作圖形界面,他的線程任務是在後天進行數據運算等。

使用方法一的步驟:

  • 創建線程類,繼承QThread
  • 重寫run函數(儘量把複雜的邏輯,計算放在run函數中。)
  • 主線程中創建線程對象,調用start函數啓動線程
    只有run函數在新線程中,其餘都在主線程內

方法二:

QObject是Qt框架的基本類,但凡涉及到信號槽有關的類都是繼承於QObject。QObject是一個功能異常強大的類,它提供了Qt關鍵技術信號和槽的支持以及事件系統的支持,同時它提供了線程操作的接口,也就是QObject是可以選擇不同的線程裏執行的。

QObject的線程轉移函數是:void moveToThread(QThread * targetThread) ,通過此函數可以把一個頂層Object(就是沒有父級)轉移到一個新的線程裏。

用QObject來實現多線程有個非常好的優點,就是默認就支持事件循環(Qt的許多非GUI類也需要事件循環支持,如QTimer、QTcpSocket),QThread要支持事件循環需要在QThread::run()中調用QThread::exec()來提供對消息循環的支持,否則那些需要事件循環支持的類都不能正常發送信號,因此如果要使用信號和槽,那就直接使用QObject來實現多線程。

使用QObject創建多線程的方法如下:

  • 寫一個繼承QObject的類,對需要進行復雜耗時邏輯的入口函數聲明爲槽函數
    此類在舊線程new出來,不能給它設置任何父對象。
  • 同時聲明一個QThread對象,在官方例子裏,QThread並沒有new出來,這樣在析構時就需要調用QThread::wait(),如果是堆分配的話, 可以通過deleteLater來讓線程自殺
  • 把obj通過moveToThread方法轉移到新線程中,此時object已經是在線程中了
    把線程的finished信號和object的deleteLater槽連接,這個信號槽必須連接,否則會內存泄漏
  • 正常連接其他信號和槽(在連接信號槽之前調用moveToThread,不需要處理connect的第五個參數,否則就顯示聲明用Qt::QueuedConnection來連接)
    初始化完後調用’QThread::start()'來啓動線程.
  • 在邏輯結束後,調用QThread::quit退出線程的事件循環
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章