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;
}