【发布时间】:2015-07-15 22:05:55
【问题描述】:
我是 QT 新手,我正在尝试在按钮单击时创建和销毁 QThread(可能多次)。我已经阅读了很多帖子,但我的线程要么没有被破坏,要么在 QMain.dll 中导致无法追踪的堆异常。
我这样创建我的线程:
thread = new QThread;
reader = new Reader(); //a QObject subclass
reader->moveToThread(thread);
connect(thread, SIGNAL(started()), reader, SLOT(read()));
connect(reader, SIGNAL(timeout()), this, SLOT(threadTimeout()));
connect(reader, SIGNAL(finished()), reader, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), this, SLOT(threadFinished()));
线程然后循环运行并发送数据。 read() 函数如下所示:
void Reader::read() {
while(!stop) {
//... do something ...
}
emit finished();
}
On Button click I call
reader->setStop(true);
这打破了线程的while循环。发出完成的信号,但随后触发内存异常。如果我删除两个 deleteLater() 插槽,则不会引发异常,但线程(显然)没有被删除。
我在这里做错了吗?提前致谢。
【问题讨论】:
-
查看 Qt 文档中的 QThread。工作人员未连接到
deleteLater,并且工作人员resultReady,我认为它与您的Reader::finished 相同,连接到插槽handleResults,我认为与您的threadFinished相同.看看那里并做出相应的调整。 -
我试过了,但这并没有删除我的线程。在这个例子中 thread->quit() 和 thread->wait() 在主类的析构函数中被调用。我不能这样做,因为我想在不调用主类的析构函数的情况下多次打开和关闭线程。
标签: c++ multithreading qt