1.QT多線程涉及到主線程和子線程之間交互大量數據的時候,使用QThread並不方便,因為run()函數本身不能接受任何參數,因此只能通過信號和槽的交互來獲取數據,如果只是單方面簡單交互數據還過得去,如果涉及多次主、子線程之間的交互的時候,這種方式是很不方便的,這裡采取另外一種方式,建一個繼承自QObject的類,進行movetoThread()操作:
class FileThread :public QObject { Q_OBJECT public: QString m_path; QFile *m_file; signals: void readend(QStringList headerList, QVector < QStringList > listArray, long row, long column); public slots: void getFile(QString path); };
然後在GUI線程裡面,進行如下設置:
FileThread *myfilethread=new FileThread(); QThread *thread = new QThread; //下面兩行用於注冊類型,QT線程之間傳遞數據必須要是元類型,不是元類型的要注冊 qRegisterMetaType<QStringList>("QStringList"); qRegisterMetaType<QVector<QStringList>>("QVector<QStringList>"); myfilethread->moveToThread(thread); connect(this, SIGNAL(startread(QString)), myfilethread, SLOT(getFile(QString))); connect(myfilethread, SIGNAL(readend(QStringList, QVector<QStringList>, long, long)), this, SLOT(showdata(QStringList, QVector<QStringList>, long, long))); thread->start(); emit startread(path);
2.注意,線程之間的數據交互只支持元數據類型,一些組合的復雜類型必須進行注冊才能進行交互,注冊方式就是qRegisterMetaType<QVector<QStringList>>("QVector<QStringList>");
3.使用多線程的情況多為:GUI主線程裡面涉及大量循環操作時,會造成界面卡死現象,無論彈框或者什麼都不會顯示應有的數據,此時需要把循環操作另起線程,另外,注意子線程裡面不能新建UI操作。
這個好像不用多線程那麼復雜吧...如果只是這個功能,一個主線程就夠了的
我學習QT的線程模塊沒多久。實現方案是繼承QThread類,編寫一個新的Thread線程類。
然後在主進程中要調用的時候就創建一個新的Thread並調用run函數啟動線程。可以用數組存放這些thread,這樣可方便主線程對這些線程的管理。