moveToThread使用与不同任务的使用,我主要用来使用读取mysql数据,这个动作会消耗很多时间,不使用多线程会造成卡顿。以下是CPP代码
mysql_thread::mysql_thread(QObject *parent) : QObject(parent)
{
}
mysql_thread::~mysql_thread()
{
}
void mysql_thread::task_01(void)
{
int i=0;
while(1)
{
if(thread_start == 1) //标志位=1,循环执行耗时函数
{
emit task_01_signal(i++);
QThread::msleep(500);
qDebug("------------------%d",i);
}
else //标志位=0,跳出循环,线程执行结束
{
break;
}
}
emit Finshed(); //信号 线程执行完发送
}
以下是h文件代码
class mysql_thread : public QObject
{
Q_OBJECT
public:
explicit mysql_thread(QObject *parent = nullptr);
~mysql_thread(); //析构函数;
void task_01(void);
volatile bool thread_start=1;//线程标志位
signals:
void Finshed(); //信号 线程执行完发送,这个可以不用
void task_01_signal(int value);
void task_02_signal(int value);
};
然后就是最关键main文件代码
mysql_thread_user = new mysql_thread; //
my_thread1 = new QThread(this); //
mysql_thread_user->moveToThread(my_thread1); //
//任务结束销毁线程很重要,不然主线程退出了,子线程还在跑
connect(this, &QObject::destroyed, [=](){
mysql_thread_user->thread_start = 0; //
my_thread1->exit(); //退出线程
my_thread1->wait(); //并等待线程完成当前循环
delete my_thread1;
}); //线程销毁
connect(ui->pushButton_4, &QPushButton::clicked, mysql_thread_user, &mysql_thread::task_01); // 采用按钮触发开启线程方式
// QObject::connect(my_thread1, &QThread::started, mysql_thread_user, &mysql_thread::task_01); // 线程直接开起就执行任务;
QObject::connect(mysql_thread_user,SIGNAL(task_01_signal(int)),this,SLOT(ReceiveTest(int)),Qt::QueuedConnection); //子线程和主线程连接;
my_thread1->start(); // 启动新线程