【发布时间】:2014-07-17 10:21:50
【问题描述】:
我正在“搞乱”线程池,我注意到一个奇怪的异常。所以我在这里问你:我是否正确使用了这个对象?或者你认为这只是一个错误或一个虚拟警告? 这里是。我用 QThreadPool 实现了一个基本示例(它与文档中的几乎相同:http://qt-project.org/doc/qt-4.8/thread-basics.html#example-1-using-the-thread-pool)。
#include <QCoreApplication>
#include <QTimer>
#include <QRunnable>
#include <QThreadPool>
#include <QDebug>
class Work : public QRunnable
{
public:
void run()
{
qDebug() << "Hello from thread " << QThread::currentThread();
}
};
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
Work work;
work.setAutoDelete(false);
QThreadPool *threadPool = QThreadPool::globalInstance();
threadPool->start(&work);
qDebug() << "hello from GUI thread " << QThread::currentThread();
threadPool->waitForDone();
QTimer::singleShot(3000, &app, SLOT(quit()));
return app.exec();
}
如果我在状态栏中启动调试器,它会显示“正在运行”和“调试器已完成”等消息。它告诉我:
Exception at 0x75f6812f, code: 0x406d1388: Startup complete, flags 0x0 (first chance) in KERNELBASE!RaiseException
该程序有效,因为它写入了正确的内容并且不会挂起,但是该消息对我来说很奇怪。
我做错了吗?
谢谢
【问题讨论】:
-
我在这里使用 Qt 4.8.6 和 5.3.1 尝试了您的示例。我在 4.8.6 中也遇到了异常(5.3.1 做得很好)。然而,在过去的几年里,与 QT creator 一起做开发时,我也时不时遇到这些奇怪的异常,但一直不知道为什么(但它们也没有破坏我的应用程序中的任何东西)..
-
可以在事件循环启动后尝试使用
QThreadPool吗? -
在事件循环中使用线程池的行为相同。 “问题”是……微软。他们发明了这种两步异常处理,每次抛出异常时都会抛出“第一次机会异常”。即使处理得当。因此,就像 Kuba 所说,没有什么可担心的;)@TWE:可能它的行为不同,因为您使用了两个不同的调试器(4.8.6 的 msvc 和 5.3.1 的 mingw(gdb))