Qt启动子进程,子进程关闭时通知主进程,实现主进程对子进程的管理

该代码段展示了如何使用Qt框架启动子进程,并在子进程关闭时通知主进程。通过设置QProcess的信号与槽连接,当子进程状态改变或标准输出有数据时,主进程能接收到相应的信息,实现对子进程的管理和错误处理。例如,如果端口被占用或连接失败,会弹出警告对话框;而当连接成功时,也会有相应的反馈。
摘要由CSDN通过智能技术生成

Qt启动子进程,子进程关闭时通知主进程,实现主进程对子进程的管理 - 走看看


int qt_bind_port_deom::runCliProcess(CliParam_t &cli, QStringList &args)
{

    if (!g_mapProcess.contains(cli.port))
    {
        g_mapProcess[cli.port] = std::make_shared<QProcess>(this);
    }
    else {
        qDebug("端口已被占用:" + cli.port);
        return -1;
    }
//    gProcess.emplace_back(std::make_shared<QProcess>(this));
    QString dir = "./" + gCliEXE->toLocal8Bit();

    auto& process = g_mapProcess[cli.port]; 
    process->setProcessChannelMode(QProcess::MergedChannels);
#if 1
    connect(process.get(), &QProcess::readyReadStandardOutput, [=] {
        QString res = process->readAll();
        qDebug("网关返回的信息:" + res.toLatin1());
        //listen tcp :50100: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
        if (res.indexOf("bind: Only one usage of each socket address") != -1)
        {
            QStringList port = res.split(":");
            if (port.size() > 1)
                QMessageBox::warning(nullptr, "警告", "请选择其他端口号, 被占用的端口号为: " + port[1]);
            else
                QMessageBox::warning(nullptr, "警告", "本地链接端口号被占用, 请选择其他端口号");
        }
        if (res.indexOf("Error") != -1)
        {
            //ui->textEditRes->setStyleSheet("border-width:0;font: 12pt \"微软雅黑\";border-style:outset;color: rgb(255, 0, 0);");
            //ui->textEditRes->setText(QStringLiteral("连接失败!"));
            QMessageBox::warning(nullptr, "警告", "连接失败!");
        }
        if (res.indexOf("listening") != -1)
        {
            //gSetting->setCfgValue("SERVER", ui->lineEditLocalhost->text(), ui->lineEditAdd->text(), ("" == ui->lineEditName->text() ? "未命名" : ui->lineEditName->text()) + ":" + ui->lineEditAdv->text()); //""-443端口 非空-非443端口
            ui->textEditRes->setStyleSheet("border-width:0;font: 12pt \"微软雅黑\";border-style:outset;color: rgb(9, 133, 9);");
            ui->textEditRes->setText(QStringLiteral("连接成功!"));
            //emit sigInsertTable(ui->lineEditLocalhost->text());
            
            qDebug("网关连接成功:" + res.toLatin1());
            //Log::debug("网关连接成功:" + res);
        }
        });
//#else
        connect(process.get(), &QProcess::stateChanged, this, [=](QProcess::ProcessState state) {
        if (state == QProcess::ProcessState::NotRunning)
        {
            qDebug("子进程退出:");
            QMap<int, std::shared_ptr<QProcess>>::iterator it = g_mapProcess.find(cli.port);
            if (it != g_mapProcess.end())
            {
                g_mapProcess.erase(it);
            }
        }
        });

#endif

    process->start(dir, args);
//    process->waitForFinished();




    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值