gpt4 book ai didi

c++ - 我使用 Qt 的多线程应用程序出了什么问题(错误 SIGSEGV)

转载 作者:行者123 更新时间:2023-11-30 04:30:03 25 4
gpt4 key购买 nike

我是 Qt 的新手,我正在寻找 Qt 中的多线程。
正如我在 Qt Documents 中了解到的那样,我为两个线程定义了两个类:

#include <QThread>
#include <QMutex>

class thread_a : public QThread
{
Q_OBJECT
public:
explicit thread_a(QObject *parent = 0);
int counter;

protected:
void run();
};

在 CPP 文件中:

#include "thread_a.h"

thread_a::thread_a(QObject *parent) :
QThread(parent)
{
counter=0;
}

void thread_a::run()
{
counter++;
}

第二个线程类相同,但在run() 方法中使用counter--
然后我从 main.ccp 运行这两个线程。没问题。但是当我在一个插槽上运行这两个线程时,出现了问题。以“收到信号”为标题的对话框,说我“下级停止,因为它收到来自操作系统的信号。信号名称:SIGSEGV,信号含义:段错误”

怎么了?

更新:
这是我的插槽:

public slots:
void run_threads(bool);

void MainWindow::run_threads(bool bl)
{
thread_a a;
thread_b b;
a.start();
b.start();
}

然后我通过以下方式将按钮连接到此插槽:

QObject::connect(ui->pushButton, SIGNAL(clicked(bool)),
this, SLOT(run_threads(bool)));

最佳答案

您的插槽创建您的线程类的两个实例,启动它们,然后退出。那时函数返回并且实例超出范围,因此被破坏。您应该保留对实例的访问权限,以免它们被破坏并可能重新使用它们。

class MainWindow {
//...other stuff
public slots:
void run_threads(bool);
private:
thread_a a;
thread_b b;
//...other stuff
};

void MainWindow::run_threads(bool bl)
{
if(!a.isRunning())
a.start();

if(!b.isRunning())
b.start();
}

关于c++ - 我使用 Qt 的多线程应用程序出了什么问题(错误 SIGSEGV),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8971500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com