关于QT子线程无限循环 主线程界面卡死的问题

ObsessionLife 2018-06-07 11:51:45
我的程序思路是 主线程有两个按钮,点击开始,主线程给子线程发消息,子线程开始无限循环打印语句。点击结束,主线程通知子线程停止循环,子线程处理后通知主线程关闭该子线程。
但是遇到的问题是,子线程的无限循环开始后,主线程界面就卡死了。
#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>
#include <QDebug>
#include <QMutex>
class MyThread : public QThread
{
Q_OBJECT

public:
void setData(double d1,double d2);
MyThread();
~MyThread();

private slots:
void runslot(const double d1,const double d2);
void stopslot(void);

signals:
void callFather(void);

protected:
void run() override;
private:
double data1;
double data2;
bool is_stop;
QMutex mutex;


};

#endif // MYTHREAD_H


#include "mythread.h"

MyThread::MyThread()
{
is_stop = false;
}

MyThread::~MyThread()
{

}

void MyThread::runslot(const double d1,const double d2)
{
int i = 0;
while(true)
{
qDebug()<<i++<<d1<<" "<<d2<<endl;
mutex.tryLock();
if(is_stop || i == 100)
{
mutex.unlock();
qDebug()<<"call father";
emit callFather();
break;

}
else{
mutex.unlock();
}
msleep(100);
}

//emit callFather();
}
void MyThread::run()
{
//is_stop = false;
//exec();
}


void MyThread::stopslot(void)
{
mutex.tryLock();
is_stop = true;
mutex.unlock();

}

void MyThread::setData(double d1,double d2)
{
data1 = d1;
data2 = d2;
}


#ifndef TEST0517_H
#define TEST0517_H

#include <QtGui/QMainWindow>
#include "ui_test0517.h"
#include <QDebug>
#include "mythread.h"
class Test0517 : public QMainWindow
{
Q_OBJECT

public:
Test0517(QWidget *parent = 0, Qt::WFlags flags = 0);
~Test0517();
MyThread *mythread;
//bool stoped = false;
// QMutex m_mutex;


private:
Ui::Test0517Class ui;

signals:
void operate_start(double d1,double d2);
void operate_stop(void);

private slots:
void on_pushButton_2_clicked();
void on_pushButton_clicked();
void closeThread();


};

#endif // TEST0517_H

#include "test0517.h"
#include <QMessageBox>


Test0517::Test0517(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
mythread = new MyThread();
connect(this,SIGNAL(operate_start(double,double)),mythread,SLOT(runslot(double,double)));
connect(this,SIGNAL(operate_stop(void)),mythread,SLOT(stopslot(void)));
connect(mythread,SIGNAL(callFather(void)),this,SLOT(closeThread(void)));
mythread->start();
//QObject::connect(this,SIGNAL(operate_stop),&mythread,SLOT(runslot));
//connect(this,SIGNAL(operate_stop),&mythread,SLOT(stopslot));

}

Test0517::~Test0517()
{

}


void Test0517::on_pushButton_clicked()
{
emit operate_start(1.5,1.5);
//mythread.start();
}


void Test0517::on_pushButton_2_clicked()
{
emit operate_stop();
}

void Test0517::closeThread()
{
qDebug()<<"shutdown";
mythread->quit();
}


子线程和主线程的通信是用的 signal 和slot
做项目需要用到qt 第一次使用,望指教
...全文
5734 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
月夜竹清 2021-02-18
  • 打赏
  • 举报
回复
要把无限循环的函数放到run函数里面,同时 msleep 几毫秒,这个需要怎么实现?不是很懂
ObsessionLife 2018-06-07
  • 打赏
  • 举报
回复
我的目的是希望 主线程通知子线程开启后,就不用再管子线程了 让他进行自己的运算,直到通知他结束就好了
ObsessionLife 2018-06-07
  • 打赏
  • 举报
回复
代码中有些其他的变量之类的,忽视就好了
feiyangqingyun 2018-06-07
  • 打赏
  • 举报
回复 1
居然将耗时操作放在run函数外面?
水军总督 2018-06-07
  • 打赏
  • 举报
回复
谢邀,解决了就好。
ObsessionLife 2018-06-07
  • 打赏
  • 举报
回复 1
自己已解决。要把无限循环的函数放到run函数里面,同时 msleep 几毫秒。

21,488

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧