运行QThread :: run()会立即崩溃应用程序

时间:2011-08-15 19:32:57

标签: multithreading qt

我开始编写一个小qt应用程序来计算校验和。在无线程代码运行良好之后,由于主窗口在计算更大文件的散列时阻塞,因此我采用了更加响应的方式。

但是调用run()方法会因为未知原因而失败。我甚至完全清除了run-method。无论我做什么:SIGSEV。

来自qt的其他线程代码帮助编译并运行没有问题 - 甚至我编码的其他应用程序中的线程代码仍在运行,但这不是:

标题:

#include <QThread>
class Hasher : public QThread
{
    Q_OBJECT

public:
    Hasher();
    void computeHash();

protected:
    void run();

};

实施

#include "hasher.h"

Hasher::Hasher()
{
}

void Hasher::computeHash() {
    start();
}

void Hasher::run() {
    // compute the hash, but for now simply return
}

呼叫者

Hasher h
h.computeHash();

正如我上面所说的那样,在没有线程的情况下运行良好但在使用线程时崩溃。 我在64位ARCH-Linux上使用QT 4.7.3 - 我真的对此毫无头绪。 也许有人可以提供帮助。

2 个答案:

答案 0 :(得分:2)

如果您这样做,您的线程将在堆栈上创建,并且当线程仍在运行时它将被销毁

void myfunction ()
{
 Hasher h
 h.computeHash();

}

NeilMonday的例子很有效,因为他的代码中有一个return a.exec();,可以让Hasher线程在堆栈中保持活动状态。所以你必须让你的线程更长寿。

  1. 使其成为您班级的成员变量或
  2. 在堆上创建Hasher* h = new Hasher ();
  3. 使用QtConcurrentRun和QFuture,不要乱用线程。

答案 1 :(得分:0)

您发布的代码在我的计算机上运行。我只有一个main.cpp,haser.h和hasher.cpp。文件hasher.h看起来与你的相同,但这是我的其他文件。

这是我的main.cpp的样子:

#include "hasher.h"
#include <iostream>
#include <QtCore/QCoreApplication>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Hasher h;
    h.start();

    while(true)
    {
        std::cout<<"test1" << std::endl;
    }
    return a.exec();
}

这是hasher.cpp:

#include "hasher.h"
#include <iostream>
Hasher::Hasher()
{
}

void Hasher::computeHash() {
}

void Hasher::run() {
    // compute the hash, but for now simply return
    while(true)
    {
        std::cout<<"TEST 2" << std::endl;
    }
}

我使用Qt 4.6.3在Windows 7 64上运行。

另外,我假设您的代码比这更复杂,并且执行互斥是非常重要的。如果您还没有,请参阅QMutex。