【问题标题】:QThreadPool strange exceptionQThreadPool 奇怪的异常
【发布时间】: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))

标签: c++ qt exception


【解决方案1】:

这是第一次机会例外。它显然会被代码捕获并处理,否则你的应用程序就会崩溃。所以这不是问题。

【讨论】:

  • 很高兴知道。我不知道这种“第一次机会例外”的东西;每次抛出代码中的异常时都会编写此“行”,即使处理得当。所以..谢谢!
猜你喜欢
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多