一、创建线程
headThread[0] = CreateThread(NULL,0,run1,(void*)this,0,&threadID[0]);
headThread[1] = CreateThread(NULL,0,run2,(void*)this,0,&threadID[1]);
headThread[2] = CreateThread(NULL,0,run3,(void*)this,0,&threadID[2]);
二、线程具体执行代码
DWORD WINAPI MainWindow::run1(LPVOID p)
{
MainWindow * w = (MainWindow*)p;
w->showPrintf1();
return 0;
}
DWORD WINAPI MainWindow::run2(LPVOID p){
MainWindow * w = (MainWindow*)p;
w->showPrintf2();
return 0;
}
DWORD WINAPI MainWindow::run3(LPVOID p){
MainWindow * w = (MainWindow*)p;
w->showPrintf3();
return 0;
}
void MainWindow::showPrintf1()
{
while (1) {
qDebug()<<"111";
Sleep(1000);
}
}
void MainWindow::showPrintf2()
{
while (1) {
qDebug()<<"222";
Sleep(600);
}
}
void MainWindow::showPrintf3()
{
while (1) {
qDebug()<<"333";
Sleep(60);
}
}
三、关闭线程
int fd = -1;
for(int i=0; i<3; i++){
fd = TerminateThread(headThread[i],threadID[i]);
if(!fd){
qDebug()<< "关闭线程: " << i+1 << "失败";
}else{
qDebug()<< "关闭线程: " << i+1 << "成功";
}
}
头文件
#include <QMainWindow>
#include <QDebug>
#include <windows.h>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
static DWORD WINAPI run1(LPVOID p);
static DWORD WINAPI run2(LPVOID p);
static DWORD WINAPI run3(LPVOID p);
void showPrintf1(void);
void showPrintf2(void);
void showPrintf3(void);
private:
Ui::MainWindow *ui;
HANDLE headThread[10];
DWORD threadID[10];
四、总结
Qt开启多线程后,不能直接将获取到的数据刷新到界面上。应该再另起一个信号槽,置一个临时缓冲区,将数据先刷新到缓冲区,缓冲区满后,再触发信号,将缓冲区数据刷新到界面上,可以防止界面卡顿。