#include
#include<process.h>
#include<Windows.h>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
static unsigned int __stdcall ThreadFun(void * pParam);
signals:
void sigPrint();
private slots:
void on_pushButton_clicked();
void slotPrint();
private:
Ui::MainWindow *ui;
};
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(this, &MainWindow::sigPrint, this, &MainWindow::slotPrint);
}
MainWindow::~MainWindow()
{
delete ui;
}
unsigned int MainWindow::ThreadFun(void pParam)
{
MainWindow * po = (MainWindow)pParam;
emit po->sigPrint();
qDebug()<<"emit";
return 0;
}
void MainWindow::on_pushButton_clicked()
{
HANDLE hThread = (HANDLE)_beginthreadex(nullptr, 0, &MainWindow::ThreadFun, this, 0, nullptr);
SetThreadPriority(hThread, 2);
//QtConcurrent::run(this, &MainWindow::ThreadFun);
for(int i=0;i<5;i++)
{
QThread::msleep(1000);
}
qDebug()<<"on";
}
void MainWindow::slotPrint()
{
qDebug()<<"test";
}
运行的结果是
emit
on
test
connect参数改成Qt::BlockingQueuedConnection
运行结果是
on
test
emit
怎么才能输出test,emit,on
void sigPrint();信号写在mainwindows里了,相当于自己给自己发信号,没有任何意义。信号应该放在线程类中;
而且,在界面中调用sleep函数是大忌,不要这么搞。当然,这里只是测试的话就无所谓了。
我这里没有安装msvc+qt,所以没法测试代码的正确性,只提供一个思路。
(1)新建一个类MyThread,继承QThread类
(2)添加信号void sigPrint();和run函数;
MyThread.h文件:
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = 0);
signals:
void sigPrint();
private:
void run();
};
#endif // MYTHREAD_H
MyThread.cpp文件
#include "mythread.h"
#include <QDebug>
MyThread::MyThread(QObject *parent) :
QThread(parent)
{
}
//也就是相当于把原来ThreadFun(void pParam)函数的信号发送部分移动到这里来了
void MyThread::run()
{
emit sigPrint();
sleep(1);//这里加个休眠,让主进程的槽函数先输出,休眠时间你自己调整一下
qDebug()<<"emit";
}
这样在mainwindow中,只需要生成Mythread类的一个实例,然后调用就可以了。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "mythread.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void slotPrint();
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
MyThread* mthread;
};
#endif // MAINWINDOW_H
MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
mthread = new MyThread();
//mthread->setPriority(QThread::LowestPriority); //最低优先级,就2行代码,执行效率很快,这个优先级设置其实没多大用处
connect(mthread, SIGNAL(sigPrint()), this, SLOT(slotPrint()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::slotPrint()
{
qDebug()<<"test";
}
void MainWindow::on_pushButton_clicked()
{
mthread->start();
for(int i=0;i<5;i++)
{
QThread::msleep(1000);
}
qDebug()<<"on";
}