【问题标题】:How to Run a whole QApplication Asynchronously?如何异步运行整个 QApplication?
【发布时间】:2013-08-07 09:56:43
【问题描述】:

我正在尝试将修改后的 qt-programm 作为库运行。我需要它不要阻塞主执行。

所以我想做的是运行 QApplication 并开始执行主应用程序。我如何做到这一点?

我的第一个想法是在单独的线程中运行它。

void MyClass::execute() {
    someClass = someClass::instance();
    std::thread t1(&MyClass::startApp, this);
    someClass->someFunction();
    someClass->doMoreStuff();
}
void MyClass::startApp() {
    QApplication app(argc, argv);
    app.exec();
    QCoreApplication::quit();
}

但这会导致Call to '__invoke' is ambiguous 错误。虽然我不知道__invoke 被覆盖的原因/位置以及如何处理此错误。 :(

那么我怎样才能做到 QApplication 不会阻塞主执行呢?

【问题讨论】:

    标签: c++ multithreading qt asynchronous concurrency


    【解决方案1】:

    设计模式是完全错误的,QApplication 和 QCoreApplication 不应该在一个应用程序中相乘。例如,你应该做的是让你自己的类像:

    class LibraryCore: public QObject {
    }
    

    并将 QApplication 替换为您未来库源中的此类。然后你应该在LibraryCore中实现所需的方法(在应用程序中使用的方法)使它们正常工作..

    【讨论】:

    • 感谢您的回答。所以你建议不要使用QApplication。当我尝试不使用它时,我收到几个错误,告诉我要实例化 QApplication。您能否更详细地解释一下您的计划?
    • 您是否打算将 Qt 应用程序移植到您想与非 Qt 项目一起使用的库?这看起来也不是一个好主意……
    • 是的,这就是我打算做的。我想在我的应用程序中使用 PhantomJS。我需要访问 PhantomJS 网页。
    • 好吧,那么我仍然建议按照我建议的方式使您的应用程序基于 Qt.. 问题是 Qt 它不是真正的支持库,而是假设开发遵循一些规则的框架..
    • 哦...好的,谢谢。我的计划是将 PhantomJS 放在一个黑盒中,并通过一个提供所需功能的简单接口与之交互。我仍然没有真正理解你的回答是什么意思以及这如何解决我的问题:(对不起。
    猜你喜欢
    • 2016-03-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 2023-03-04
    相关资源
    最近更新 更多