在这段代码中,Qt部分(fun1())总是崩溃。它写道:
terminate called without an active exception
Aborted (core dumped)
应该是什么错?当我在main中调用Qt的东西时,我不使用线程它运行良好,但我需要调用另一个函数并使用线程(fun2()仅用于ilustration) 我的代码在这里:
#include "../common/main_window.hpp"
#include <QtGui/QApplication>
#include <QtGui>
#include <thread>
#include <iostream>
int argc_;
char **argv_;
void fun1()
{
QApplication a(argc_,argv_);
MainWindow w;
w.show();
a.exec();
}
void fun2()
{
std::cout << "Print something" << std::endl;
}
int main(int argc, char **argv)
{
//argc_ = malloc((1)*sizeof(char*));
argc_= argc;
argv_= argv;
std::thread first(fun1);
std::thread second(fun2);
return 0;
}
答案 0 :(得分:8)
Qt不支持在主线程的任何线程中运行GUI事件循环。您所做的事情恰好在Windows上运行,并且可能适用于某些Unix,但它永远不会在OS X或iOS上运行。因此,在生产代码中,没有像你那样运行线程的地方。
fun1()
应该从main
调用,你必须等到另一个线程的仿函数在你破坏线程之前完成。
int fun1(int & argc, char ** argv)
{
// QApplication might modify argc, and this should be fed back to
// the caller.
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
int main(int argc, char **argv)
{
std::thread worker(fun2);
int rc = fun1(argc, argv);
worker.join();
return rc;
}
永远不要通过<QtModule/Class>
加入。这会隐藏项目文件中的配置错误。您应该逐个包含单个classess,或一次性包含整个模块的声明。
因此,您的测试用例应具有以下两种包含样式之一:
#include <QtGui> // Qt 4 only
#include <QtWidgets> // Qt 5 only
或
#include <QApplication> // Qt 4/5
#include <Q....> // etc.
答案 1 :(得分:3)
程序崩溃的实际原因是std :: thread在它的析构函数中抛出异常,如果线程既没有连接也没有分离。
为避免崩溃,您需要加入两个线程。
答案 2 :(得分:2)
创建线程后,main函数返回,导致程序退出并终止所有正在运行的线程。在两个线程上调用join
,因此主函数不会返回,直到线程自行终止。