Qt多线程退出问题

B4STU 2020-09-28 07:55:45
用terminate退出有时候程序会崩溃,写了个测试代码,直接上代码吧,点close程序偶尔会崩溃,在此请教一下各位大佬帮忙分析看看!


class m_work : public QObject{
Q_OBJECT


public:
m_work(QObject *parent = nullptr){

xdebug << "m_work" << QThread::currentThreadId();


}
~m_work(){

}

Q_SLOT
void m_slot(void){

xdebug << "m_slot" << QThread::currentThreadId();
QThread::msleep(5000);
xdebug << "sleep end" << QThread::currentThreadId();

}

private:




};

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();

private slots:
void on_btn_close_released();

void on_btn_open_released();

signals:
void sig();

private:
Ui::MainWindow *ui;

m_work *work;
QThread *m_thread;

};



MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);

xdebug << "MainWindow" << QThread::currentThreadId();

work = new m_work;
m_thread = new QThread(this);

work->moveToThread(m_thread);

m_thread->start();
connect(this,&MainWindow::sig,work,&m_work::m_slot);

}

MainWindow::~MainWindow()
{
xdebug << "~MainWindow";

delete work;
delete m_thread;
delete ui;
}


void MainWindow::on_btn_close_released()
{
xdebug << "on_btn_close_released";
m_thread->quit();


if(m_thread->wait(1000) == false){
xdebug << "m_thread terminate";
m_thread->terminate();
m_thread->wait();
}

qApp->quit();
}

void MainWindow::on_btn_open_released()
{

xdebug << "on_btn_open_released";
emit sig();
}
...全文
18713 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
one-rabbit 2020-10-07
  • 打赏
  • 举报
回复
线程里面加 销毁标志
B4STU 2020-10-06
  • 打赏
  • 举报
回复
引用 5 楼 花千桂枝 的回复:
[quote=引用 3 楼 B4STU的回复:][quote=引用 2 楼 花千桂枝 的回复:] connect(thread,&QThread::finished,myT,&Mythread::deleteLater);

这个试过,这样也会有问题,当调用m_thread->quit();后如果线程不繁忙马上退出了就立马delete掉了,会导致m_thread->wait()返回false,进去m_thread->terminate();程序就会崩溃[/quote]
quit,wait就好了[/quote]
因为我结束线程后要马上再次启动起来,我就需要等待他完全结束,如果wait无限阻塞就会卡很久
one-rabbit 2020-10-02
  • 打赏
  • 举报
回复
引用 3 楼 B4STU的回复:
[quote=引用 2 楼 花千桂枝 的回复:] connect(thread,&QThread::finished,myT,&Mythread::deleteLater);

这个试过,这样也会有问题,当调用m_thread->quit();后如果线程不繁忙马上退出了就立马delete掉了,会导致m_thread->wait()返回false,进去m_thread->terminate();程序就会崩溃[/quote] quit,wait就好了
one-rabbit 2020-10-02
  • 打赏
  • 举报
回复
你为什么要强制结束
B4STU 2020-09-30
  • 打赏
  • 举报
回复
引用 2 楼 花千桂枝 的回复:
connect(thread,&QThread::finished,myT,&Mythread::deleteLater);

这个试过,这样也会有问题,当调用m_thread->quit();后如果线程不繁忙马上退出了就立马delete掉了,会导致m_thread->wait()返回false,进去m_thread->terminate();程序就会崩溃
qq_21042359 2020-09-29
  • 打赏
  • 举报
回复
https://bbs.csdn.net/topics/397370435 虽然不是同一个问题,不过我这里下面有个线程退出的安全方法,可以看看。
one-rabbit 2020-09-29
  • 打赏
  • 举报
回复
connect(thread,&QThread::finished,myT,&Mythread::deleteLater);

16,201

社区成员

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

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