c++ QThread关闭时销毁

qncylg1j  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(137)

大家好,我有一个工作线程在qt与C++,如果我在主窗口销毁~mainwindow{}或在工作线程销毁其本身中使用workerThreadPointer->quit();,当我关闭程序时,我会得到这个错误QThread: Destroyed while thread is still running,但如果我使用workerThreadPointer->terminate();,我不会得到任何错误,但不建议使用terminate()方法,所以我如何在关闭程序时使用quite而不崩溃犯错误
我真的用了这个,效果很好,但是这是最好的方法吗?

bool asghar;
workerThread::workerThread(){
}
workerThread::~workerThread(){
    quit();
    requestInterruption();
    asghar=0;
    wait(100);
}

void workerThread::run(){
   asghar=1;
   while(asghar==true){
   do something
}
}

基本上我强迫它用一个布尔变量退出while循环,但我不确定这是不是最好的选择,顺便说一句,如果我把等待中的100改为10,它就不起作用了。

7kqas0il

7kqas0il1#

我不确定这是一个打字错误,因为你只写了伪代码,或者它在你的程序中实际上是这样的。但是while(asgar=true)并没有做你认为它做的事情。典型的===错误。

void workerThread::run(){
   asghar=1;
   while(asghar=true){      // bug
   do something
}

应该是这样的:

void workerThread::run(){
   asghar=1;
   while(asghar == true) {  // fixed
   do something
}

另外,编译器可以自由地优化asghar的检查,因为它的访问不是线程安全的。考虑将asghar更改为std::atomic<bool>类型,或者用互斥体 Package 赋值和检查调用。
asghar的赋值和比较检查周围添加print/log语句,以查看发生了什么。

相关问题