我必须将项目从 QT5 降级到 QT4,并在执行此操作时出现奇怪的缓冲区溢出错误。这是我的代码:
我像这样创建一个 QThread:
thread = new QThread;
reader = new Reader();
reader->setParams(samplingRate);
reader->moveToThread(thread);
connect(thread, SIGNAL(started()), reader, SLOT(read()));
connect(reader, SIGNAL(finished()), thread, SLOT(quit()));
connect(thread, SIGNAL(finished()), this, SLOT(threadFinished()));
connect(reader, SIGNAL(finished()), reader, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
connect(reader, SIGNAL(errorMsg(QString)), this, SLOT(threadErrorMsg(QString)));
thread->start();
在我的线程中,我有以下代码:
try {
while(condition) {
...something
}
} catch(Exception e) {
emit errorMsg("Error");
}
emit finished();
我的主线程中的插槽如下所示:
void MainWindow::threadFinished() {
reader = NULL;
delete thread;
thread = NULL;
}
void MainWindow::threadErrorMsg(QString message) {
QMessageBox::critical(this, "Error", ("Error: " + message).toStdString().c_str(), QMessageBox::Ok);
}
所有这些在 QT5 中都运行良好。错误消息框正确显示,线程被破坏。然而,在 QT4 (4.8.1) 中,当发生错误并发出 errorMsg() 时,我会收到缓冲区溢出错误。如果我不发出 errorMsg("Error") 并仅通过调用 finish() 来销毁线程,则不会发生缓冲区溢出。关于这里出了什么问题有什么想法吗?
更新:
如果我不访问 threadErrorMsgit 中的 QString 则可以工作。就像这样:
void MainWindow::threadErrorMsg(QString message) {
QMessageBox::critical(this, "Error", "Error", QMessageBox::Ok);
}
我究竟做错了什么?