程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> QT多線程筆記,qt多線程

QT多線程筆記,qt多線程

編輯:C++入門知識

QT多線程筆記,qt多線程


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多線程

這個好像不用多線程那麼復雜吧...如果只是這個功能,一個主線程就夠了的
 

qt多線程編程裡面怎設置線程數?

我學習QT的線程模塊沒多久。實現方案是繼承QThread類,編寫一個新的Thread線程類。
然後在主進程中要調用的時候就創建一個新的Thread並調用run函數啟動線程。可以用數組存放這些thread,這樣可方便主線程對這些線程的管理。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved