我开始编写一个小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 - 我真的对此毫无头绪。 也许有人可以提供帮助。
答案 0 :(得分:2)
如果您这样做,您的线程将在堆栈上创建,并且当线程仍在运行时它将被销毁!
void myfunction ()
{
Hasher h
h.computeHash();
}
NeilMonday的例子很有效,因为他的代码中有一个return a.exec();
,可以让Hasher线程在堆栈中保持活动状态。所以你必须让你的线程更长寿。
Hasher* h = new Hasher ();
或答案 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。