【发布时间】:2015-01-21 07:50:48
【问题描述】:
我正在运行一个带有 C++ 插件的 qml 应用程序。申请很简单:
QApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:///ui/views/mainwindow.qml")));
return app.exec();
但是 qml 插件有很多代码。为了避免在 qml 中冻结,我通过 moveToThread() 将对象放入线程中,并使用 Qt::QueuedConnection 参数通过 QMetaObject::invokeMethod() 异步调用方法。问题是我通过invokeMethod 调用的方法可能会抛出异常,然后程序会因为我无法捕获它们而崩溃:
try {
QMetaObject::invokeMethod(&qlNetwork, "disconnect", Qt::QueuedConnection);
} catch (const std::runtime_error& e) {
emit error(e.what());
}
当然,这段代码不会起作用,因为调用是非阻塞的。问题是:那么我如何才能从不同线程(QThread)中的对象捕获异常?
【问题讨论】:
标签: c++ multithreading qt exception qthread