使用 Qt 的多线程应用程序有啥问题(错误 SIGSEGV)

Posted

技术标签:

【中文标题】使用 Qt 的多线程应用程序有啥问题(错误 SIGSEGV)【英文标题】:What is wrong in my Multi-Threading app using Qt (Error SIGSEGV)使用 Qt 的多线程应用程序有什么问题(错误 SIGSEGV) 【发布时间】:2012-01-23 12:19:48 【问题描述】:

我是 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();

我通过以下方式将 PushButton 连接到该插槽:

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

【问题讨论】:

请发布您用于“在插槽上运行两个线程”的代码。 【参考方案1】:

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

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();

【讨论】:

以上是关于使用 Qt 的多线程应用程序有啥问题(错误 SIGSEGV)的主要内容,如果未能解决你的问题,请参考以下文章

纯 C++ 中的多线程?

如果 GIL 存在,Python 中的多线程有啥意义?

Delphi XE 中的多线程有啥新功能?

转:iOS开发者经常用到的多线程都有啥?

QT的多线程使用

Java的多线程有啥用处