【问题标题】:How can I create a process in C++ or Qt?如何在 C++ 或 Qt 中创建进程?
【发布时间】:2025-11-23 01:45:01
【问题描述】:

你好人们需要你的帮助,可以使用 qt 或 c++,我想创建一个进程,但是一个使用我的程序的函数而不是外部程序的进程,像这样......对不起这个例子和原谅我的英语谢谢

void count(){blablabla}
int main(){QProcess p = new QProcess(count());p.start();}

【问题讨论】:

  • 必须是一个进程吗?不能是线程吗?
  • yes yes 一个过程,有可能吗?
  • 是的,这是可能的,但它很麻烦。基本上,您必须创建一个运行您自己的程序(它启动自己的可执行文件)的进程,并使用一些特殊参数告诉它调用您想要调用的函数。请记住,在大多数平台上,进程不共享内存,而线程则共享。
  • 通过阅读QProcess doc,它写道:“QProcess 类用于启动外部程序并与它们通信。”。所以我认为你不能,你可以使用 thread 代替。
  • 没有线程,认为当我关闭主应用程序时线程将关闭,我不想要这个

标签: c++ qt function process qprocess


【解决方案1】:

恕我直言,最简单的方法是使用线程。如果您对使用线程的唯一反对意见是线程将被终止,您可以通过在退出进程之前等待线程完成来克服它。

void doSomething();

int main (int argc, char *argv[])
{
    QApplication app(argc, argv);
    ...
    // Start a doSomething() in another thread using pure C++11
    std::thread cppThread(&doSomething);
    // The same using Qt
    QFuture<void> qtThreadResult = QtConcurrent::run(&doSomething);
    ...
    int r = app.exec();
    ...
    // The Qt application is closed
    // We wait for the thread to complete
    cppThread.join();
    // The same using Qt
    qtThreadResult.waitForFinished();

    // Everything is finished, we can exit
    return r;
}

如果您绝对需要创建另一个进程,您有 2 个解决方案,或者您创建 2 个程序 A 和 B,然后从 A 启动 B,或者您有一个程序并且您需要提供命令行参数以便它可以改变它的行为。

void doSomething();

int main (int argc, char *argv[])
{
    QApplication app(argc, argv);
    if (app.arguments().contains("--foo"))
    {
        doSomething();
        return 0;
    }
    else
    {
        return app.exec();
    }
}

然后您可以使用 Qt 启动新进程:

QProcess::startDetached("B");
QProcess::startDetached("A --foo");
QProcess::startDetached(QCoreApplication::applicationFilePath(), QStringList{"--foo"});

使用纯 C++ 会稍微复杂一些。您在所有平台上都有system(),但如果您需要操作创建的进程,它并没有提供很多选择。然后,您将拥有特定于平台的解决方案,例如 Linux 上的 execl() (& co.) 和 Windows 上的 CreateProcess()

还要注意,如果您需要在 2 个进程之间共享数据,这可能会变得更加复杂;您将需要使用共享内存或套接字或管道或标准输入/标准输出...

【讨论】:

    【解决方案2】:

    您可以使用 QTimer。这将以恒定的时间间隔发出 timeout() 信号。 一秒定时器的例子,

    QTimer *timer = new QTimer(this);
        connect(timer, SIGNAL(timeout()), this, SLOT(count()));
        timer->start(1000);
    

    从那时起,count() 槽每秒被调用一次。 QTimer

    【讨论】:

      【解决方案3】:

      我已通过QtConcurrent 完成此操作,如下所示:

      1) 声明方法,该方法应该在自己的线程上运行:

      void TestClass::startWorkerThread(int parameter1) {
          // do something
      }
      

      2) 在线程中启动方法:

      #include <QtConcurrent/QtConcurrent>
      ... 
      QFuture<void> pFuture1 = QtConcurrent::run(this, &TestClass::startWorkerThread, parameter1);
      

      【讨论】: