在 Windows 错误中使用 QProcess 启动进程:“计时器只能用于以 QThread 启动的线程”

Posted

技术标签:

【中文标题】在 Windows 错误中使用 QProcess 启动进程:“计时器只能用于以 QThread 启动的线程”【英文标题】:Start process with QProcess on windows error: "Timers can only be used with threads started with QThread" 【发布时间】:2015-09-28 21:01:56 【问题描述】:

我有一个最小的例子,我正在尝试开始工作。最终目标是能够将一些信息传达给正在等待“cin”调用的程序。我想这意味着与标准输入有关。

我正在尝试使用一些 Qt 对象来帮助我在这个阶段。虽然我没有使用任何其他 Qt 东西。

我正在尝试给出错误的示例是:

#include <iostream>

#include <QtCore/QString>
#include <QtCore/QProcess>
#include <QtCore/QStringList>

int main() 

    QProcess process;
    QString prog = "test.exe";

    // Starting "test.exe":
    process.start(prog);
    bool started = process.waitForStarted();
    std::cout << started << std::endl;

    // test.exe is waiting for cin, so give "2":
    bool response = process.write("2\n");
    std::cout << response << std::endl;

这里是错误信息:

1
QObject::startTimer: Timers can only be used with threads started with QThread
1
QProcess: Destroyed while process ("test.exe") is still running.

【问题讨论】:

我打赌QProcess::waitForStarted() 需要一个事件循环才能发挥作用。您可以尝试在调用之前实例化 QApplication,或者自己手动创建 QEventLoop 【参考方案1】:

在极少数情况下,您将拥有一个没有 QApplication 或 QCoreApplication 的 Qt 应用程序。它们启动事件循环,这是计时器、事件、信号/插槽所必需的。

控制台 XML 解析器可以是这种无事件的应用程序。

看看例如这里有一个最小的 QtCoreApplication 应用程序:How do I create a simple Qt console application in C++?

在子类 QWidget 或 QObject 中开始您的进程。

【讨论】:

以上是关于在 Windows 错误中使用 QProcess 启动进程:“计时器只能用于以 QThread 启动的线程”的主要内容,如果未能解决你的问题,请参考以下文章

为啥 QProcess 将我的参数中的“=”转换为空格

带有 adb 的 QProcess 输出始终为空

在 Windows 上使用 QProcess 读取 GDAL /vsistdout/

Qt:无法使用 QProcess 启动 Windows 控制台

如何在 Windows 上通过 QProcess 启动提升的子进程?

如何在 QProcess 中使用 cmd.exe 命令