1. 程式人生 > >多執行緒重新整理UI, 用QThreadPool和QRunnable實現

多執行緒重新整理UI, 用QThreadPool和QRunnable實現

執行緒池QThreadPool實現多執行緒, 訊號槽實現非同步執行緒重新整理UI控制元件

啟動效果

呼叫是沒有問題

這裡本來是想打印出執行緒ID, 不知道怎麼用

QString(QThread::currentThread()

輸出, 怎麼轉換成QString


文件結構


執行緒類

printtask.h

#ifndefPRINTTASK_H
#definePRINTTASK_H
#include<QObject>
#include<QRunnable>
classPrintTask:publicQObject,publicQRunnable
{
Q_OBJECT
signals:
voidnotify(QString
);
public:
PrintTask();
~PrintTask();
protected:
voidrun();
signals:
//注意!要使用訊號,採用QObejctQRunnable多繼承,記得QObject要放在前面
voidmySignal();
};
#endif//PRINTTASK_H

printtask.cpp

#include"printtask.h"
#include<QThread>
#include<iostream>
usingstd::cout;
usingstd::endl;
PrintTask::PrintTask()
{
}
PrintTask::~PrintTask()
{
}
//執行緒真正執行的內容
voidPrintTask::run()
{
QStringprintf;
printf=tr("PrintTaskruncalled");
//printf.append(QString(QThread::currentThread()));
//cout<<"PrintTaskrun被呼叫,呼叫執行緒ID為:"<<QThread::currentThread()<<endl;
emitnotify(printf);
}

mainwindow.h

#ifndefMAINWINDOW_H
#defineMAINWINDOW_H
#include<QMainWindow>
namespaceUi{
classMainWindow;
}
classMainWindow:publicQMainWindow
{
Q_OBJECT
publicslots:
voidnotify(QStringprint);
public:
explicitMainWindow(QWidget*parent=0);
~MainWindow();
privateslots:
voidon_pushButton_clicked();
private:
Ui::MainWindow*ui;
};
#endif//MAINWINDOW_H

mainwindow.cpp

#include"printtask.h"
#include<QThread>
#include<iostream>
usingstd::cout;
usingstd::endl;
PrintTask::PrintTask()
{
}
PrintTask::~PrintTask()
{
}
//執行緒真正執行的內容
voidPrintTask::run()
{
QStringprintf;
printf=tr("PrintTaskruncalled");
//printf.append(QString(QThread::currentThread()));
//cout<<"PrintTaskrun被呼叫,呼叫執行緒ID為:"<<QThread::currentThread()<<endl;
emitnotify(printf);
}

這裡的傳送型別可以隨便設定, int 或者 QString.