使用 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)的主要内容,如果未能解决你的问题,请参考以下文章