如何杀死并重新运行qt中的主进程?

Posted

技术标签:

【中文标题】如何杀死并重新运行qt中的主进程?【英文标题】:How to kill and rerun the main process in qt? 【发布时间】:2019-10-24 11:40:51 【问题描述】:

我有一个可以运行其他 exe 文件的应用程序。一些按钮并连接到可执行文件。当我单击按钮时,开始运行另一个程序......这很好,但仍然打开主窗口并且程序仍在运行。我想实现当另一个程序正在运行时主窗口停止运行(或消失),当我从另一个应用程序退出时,运行(或出现并运行)主进程。 我试过这个:

void MainWindow::RunSys(QString sh)

    this->close();
    QProcess ps;
    if(ps.execute(sh)<0)
    
        QMessageBox messageBox;
        messageBox.critical(nullptr,"Error",sh + "Error!");
    
    this->show();


//I call the function this way:
QString sh = settings->value("Run").toString();
connect(pButton, &QToolButton::clicked, [=]  RunSys(sh); );

它在 Linux 上运行。打开可执行程序,但主程序直到在 Windows 上运行。我能做什么?

【问题讨论】:

感谢您的编辑。 “仍在运行”,您的意思是主窗口没有隐藏(仍然可见)吗? 是的,我在主窗口上有一个时钟,它仍然显示当前时间,我可以点击按钮(没有冻结)。 老实说,我无法重现您的错误,它适用于我...您如何调用该函数?确切的命令是什么?如果你能写一个最小的可复现的例子,也许我们会发现问题所在。 我以这种方式将此函数连接到按钮:` QString *sh = new QString (settings->value("Run").toString()); connect(pButton, &QToolButton::clicked, [=] RunSys(*sh); ); ` 您可以编辑您的问题以添加这些附加信息。我不明白你为什么使用QString* 而不是QString 【参考方案1】:

我无法重现该错误,我们需要您提供一个完整、最小且可重现的示例来说明该错误。

如果对你有帮助,我已经根据你的编写了以下示例代码:

标题

class MainWindow : public QMainWindow

    Q_OBJECT

    protected:
        QPushButton * pb;

    public:
        MainWindow();

    void runShellCmd(const QString & cmd);
;

实施

MainWindow::MainWindow()

    // Build the main window
    resize(600, 400);
    pb = new QPushButton("run cmd", this);
    this->setCentralWidget(pb);

    // Create the command
    QString cmd("ping 127.0.0.1 -n 6");

    // Connect the signal
    connect(pb, &QPushButton::clicked, [=]()runShellCmd(cmd););


void MainWindow::runShellCmd(const QString & cmd)

    QProcess ps;

    this->close();

    int exit_code = ps.execute(cmd);

    switch(exit_code)
    
        // Do what you want with exit code
        default:;
    

    this->show();

主要功能

int main(int argc, char ** argv)

    QApplication app(argc, argv);

    MainWindow w;
    w.show();

    return app.exec();

而且效果很好。


编辑:

我明白出了什么问题。您的 calc.exe 示例向我低声说出了这个问题:)

实际上,QProcess::execute() 会阻塞,直到命令调用返回。在这种情况下,它会在启动后立即返回,而不是在窗口关闭时返回。所以你得到了预期的行为。

恐怕这样做会困难得多。因为calc.exe是一个外部程序,除非你能从外部程序中读取某种关闭信号,否则你将无法检测到它何时关闭。

【讨论】:

如果我使用你的完整代码,它可以工作。但是在我的程序中是同样的问题:(当我点击一个按钮时主窗口消失了,但是另一个程序和主窗口同时出现。主窗口没有被阻塞和运行(运行时钟,我可以点击按钮随心所欲)(例如一个按钮是执行计算,我单击它主窗口消失,几分钟后出现计算器和主窗口)。 所以我觉得程序不会在“this->show();”之前停止它并没有等待其他程序执行this->show()命令。 哦,如果我将您的 cmd 更改为“calc”,问题将是相同的 :( 啊 :( 它让我发疯 :(( 任何其他想法?:(( @Kaguro 其实这很正常,因为QProcess::execute() 一直等到运行命令返回。当您运行 calc.exe 时,它会在启动后返回,而不是在关闭后返回。所以你得到了预期的结果。您可以进行测试,如果您在 cmd 控制台中运行 calc.exe,您会看到控制台在启动后立即返回,因此您即使 calc.exe 没有关闭,也可以使用控制台。

以上是关于如何杀死并重新运行qt中的主进程?的主要内容,如果未能解决你的问题,请参考以下文章

Qt 4.8 杀死并重新启动 GUI

如何在父进程被杀死/完成时保持子进程处于活动状态(在 Windows 中)

如何用qt4编程结束linux进程

如何找到并杀掉 Linux 系统中的僵尸进程

如何使用 php 中的 pid 杀死 linux 进程?

如何有效地杀死C ++(Win32)中的进程?