1、用QObject的方法實現多線程
Qt有兩種多線程的方法,其中一種是繼承QThread的run函數,另外一種是把一個繼承於QObject的類轉移到一個Thread裏。 Qt4.8之前都是使用繼承QThread的run這種方法,但是Qt4.8之後,Qt官方建議使用第二種方法。
第二種方法用QObject
來實現多線程有個非常好的優點,就是默認就支持事件循環(Qt的許多非GUI類也需要事件循環支持,如QTimer
、QTcpSocket
),QThread
要支持事件循環需要在QThread::run()
中調用QThread::exec()
來提供對消息循環的支持,否則那些需要事件循環支持的類都不能正常發送信號,因此如果要使用信號和槽,那就直接使用QObject
來實現多線程。
https://doc.qt.io/qt-5/threads.html
https://wiki.qt.io/QThreads_general_usage
https://wiki.qt.io/Threads_Events_QObjects
2、QFutureWatcher實現進度條
長時間進行操作時,通常需要顯示進度條。 在某些耗時的運算中,我們沒有方法來實時跟蹤操作的進度,所知的只是運算完成時。 爲了實現進度條,您可以使用progressBar小部件,然後在另一個線程中運行該操作(使用moveToThread)。 這通常需要創建一個特殊的對象(QObject的子類,該對象運行操作,然後發出finish信號),如果您需要對許多不同的操作執行此操作,則可能會很麻煩。但是,使用QFutureWatcher和QtConcurrent::run(),這非常容易。 這篇官方文檔演示如何將這種技術與QProgressDialog和QProgressBar一起使用。
如果QProgressBar最小值和最大值都設置爲0,進度條會顯示一個繁忙指示,而不會顯示當前的值。
https://wiki.qt.io/Progress_Bar
3、多線程的高級應用
TCP Client/TCP Server
https://sourceforge.net/projects/threader-qt/
https://sourceforge.net/p/threader-qt/svn/HEAD/tree/
future/promise【推薦】
https://github.com/mhogomchungu/tasks
x、參考文獻
https://github.com/czyt1988/czyBlog/tree/master/tech/QtThread
https://www.cnblogs.com/xia-weiwen/p/10306089.html
https://github.com/Xia-Weiwen/CopyFile