如何在 C++ 或 Qt 中创建进程?

Posted

技术标签:

【中文标题】如何在 C++ 或 Qt 中创建进程?【英文标题】:How can I create a process in C++ or Qt? 【发布时间】:2017-06-26 12:35:09 【问题描述】:

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

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

【问题讨论】:

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

【讨论】:

以上是关于如何在 C++ 或 Qt 中创建进程?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 nim 中创建一个 qt 应用程序

如何在 Windows ( C++ ) 中创建进程以运行另一段代码?

在 C++、QT 中创建 setup.exe [重复]

如何在 Qt 的后续函数调用中访问在函数中创建的小部件

如何在linux中创建一个进程

在 Windows 中创建 C++ 非阻塞计时器