【问题标题】:Why is not QThread being run?为什么没有运行 QThread?
【发布时间】:2015-10-16 06:12:45
【问题描述】:

我正在使用线程开发一个带有 Qt 的应用程序。启动应用程序我启动了一个线程来做一些工作,将需要做工作的对象移动到这样的线程中

QThread aThread;
CsvLoader csvLoader;
connect(&aThread, SIGNAL(started()), &csvLoader, SLOT(compute()));
csvLoader.moveToThread(aThread);
aThread.start();

在应用程序开始时效果很好。现在,我在 UI 中有一个按钮,基本上我想做的就是从 csvLoader 重新运行 compute() 方法,只需这样做

aThread.start();

但是,使线程运行的第二次调用不是调用连接到started() 信号的槽。

知道我可以检查什么或遗漏什么吗?

【问题讨论】:

    标签: qt qthread


    【解决方案1】:

    start() 的第二次调用不会执行任何操作,因为 QThread 已经开始。

    您需要做的是将您的插槽compute() 连接到您将从onClicked() 插槽(或任何名称)发出的信号。或者直接连接到按钮信号clicked()。 请注意,您可以将多个插槽同时连接到同一个信号。

    【讨论】:

    • 但这将在 GUI 运行时在同一个线程中运行,不是吗?如果compute() 需要很长时间,这将阻塞线程。如何让 compute() 在单独的线程上被调用,同时保持 GUI 响应用户输入?
    • @BRabbit27,您对 qt 线程的理解有点错误。您从主线程发送信号,但 csvLoader 的插槽将在 aThread 中执行,因为您将 csvLoader 移至它 - qt 将处理它。但是如果你直接调用csvLoader.compute(),那么它将在主线程中执行。还要注意 csvLoader 和 aThread 的生命周期。
    • 是的,我想我没有完全理解`moveToThread() 的概念。阅读文档后,我明白了你的想法。是时候编码了!
    猜你喜欢
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    相关资源
    最近更新 更多