如何启动QTimer以使GUI不挂起-RestartStoppedProcess()-代码
我在类的ctor中创建了新的QTimer对象。当应用程序启动时,计时器也会在指定的时间启动。此计时器跟踪所有进程id,如果发现某个特定进程id未处于活动状态(从任务管理器终止),则会重新启动该特定进程。现在的问题是,由于这个QTimer对象,我的应用程序有点滞后,只有在超时之后,应用程序才会变得平滑。但5秒后,计时器再次启动,应用程序再次开始滞后。除了类的ctor之外,启动QTimer对象的最佳选择是什么如何启动QTimer以使GUI不挂起-RestartStoppedProcess()-代码,qt,qtimer,Qt,Qtimer,我在类的ctor中创建了新的QTimer对象。当应用程序启动时,计时器也会在指定的时间启动。此计时器跟踪所有进程id,如果发现某个特定进程id未处于活动状态(从任务管理器终止),则会重新启动该特定进程。现在的问题是,由于这个QTimer对象,我的应用程序有点滞后,只有在超时之后,应用程序才会变得平滑。但5秒后,计时器再次启动,应用程序再次开始滞后。除了类的ctor之外,启动QTimer对象的最佳选择是什么 qTimer = new QTimer(0); connect(qTimer, SIGN
qTimer = new QTimer(0);
connect(qTimer, SIGNAL(timeout()), this, SLOT(RestartStoppedProcess()), Qt::DirectConnection);
connect(qTimer, SIGNAL(destroyed()), qTimer, SLOT(deleteLater()), Qt::DirectConnection);
qTimer->setTimerType(Qt::VeryCoarseTimer);
qTimer->start(5000);
void ProcessMonitor::RestartStoppedProcess()
{
try
{
QProcess *objMonitorProcess = new QProcess(this);
connect(objMonitorProcess, SIGNAL(finished(int,QProcess::ExitStatus)), objMonitorProcess, SLOT(deleteLater()));
for(int i = 0; i < ui->twShowProcess->rowCount(); i++)
{
#ifdef Q_WS_LIN
// objMonitorProcess->start("pidof", QStringList() << (ui->twShowProcess->item(i, 0)->text()), QIODevice::ReadOnly);
objMonitorProcess->start("pidof "+ (ui->twShowProcess->item(i, 0)->text()), QIODevice::ReadOnly);
#elif Q_WS_WIN
QString cmd("wmic process where ");
QString qszFilters("\"processid=\'");
QString qszSubFilters = qszFilters.append(ui->twShowProcess->item(i, 1)->text().append("\'").append("\"").append(" get name"));
cmd.append(qszSubFilters);
objMonitorProcess->start(cmd.toStdString().c_str(), QIODevice::ReadOnly);
#else
QString qszProcessName = ui->twShowProcess->item(i, 0)->text().split(".").takeFirst();
objMonitorProcess->start("pgrep", QStringList() << qszProcessName, QIODevice::ReadOnly);
#endif
if((objMonitorProcess->waitForStarted(4000) == true) && (objMonitorProcess->state() == QProcess::Running))
{
if(objMonitorProcess->waitForFinished(3000) == false)
continue;
else
{
QString qszProcessStatus = ui->twShowProcess->item(i, 3)->text();
if(qszProcessStatus.compare("Running") == 0)
{
QString qszStandardOutput, qszStandardError;
qszStandardOutput.clear(); qszStandardError.clear();
qszStandardOutput = QString(objMonitorProcess->readAllStandardOutput());
qszStandardError = QString(objMonitorProcess->readAllStandardError());
if(qszStandardError.simplified().compare("No Instance(s) Available.", Qt::CaseInsensitive) == 0 && qszStandardOutput.simplified().isEmpty() == true)
{
ui->twShowProcess->selectRow(i);
if(ui->twShowProcess->selectedItems().at(0)->text().compare("LTtagdb.exe", Qt::CaseInsensitive) == 0 ||
ui->twShowProcess->selectedItems().at(0)->text().compare("LTmessagebroker.exe", Qt::CaseInsensitive) == 0)
this->StopAllApplicationsForcefully();
else
this->on_actionStop_triggered();
if(this->ptrobjContextMenu->isVisible())
this->ptrobjContextMenu->close();
ui->twShowProcess->clearSelection();
if(mobj_ProcessLogMap.mobj_ProcessAndLogMapping.contains(ui->twShowProcess->item(i, 8)->text()) == true)
{
mobj_ProcessLogMap.mobj_ProcessAndLogMapping.remove(ui->twShowProcess->item(i, 8)->text());
mobj_ProcessLogMap.mobj_ProcessAndLogMapping.insert(ui->twShowProcess->item(i, 8)->text(), QString(""));
}
else
this->mobj_ProcessLogMap.mobj_ProcessAndLogMapping.insert(ui->twShowProcess->item(i, 8)->text(), QString(""));
}
if(ui->twShowProcess->item(i, 0)->text() == "LThistdb.exe")
{
if(IsServiceRunning(QString("LThistdb.exe")) == false)
this->on_actionStopPostgreSQL_DB_Server_triggered();
}
qszStandardOutput.clear();
}
}
}
else
break;
#ifdef Q_WS_WIN
cmd.clear();
qszFilters.clear();
qszSubFilters.clear();
#endif
}
}
catch(QProcess::ProcessError pError)
{
QMessageBox objCrashExit;
objCrashExit.information(this, "Crashed", "Process error returned code: " + QString::number(pError));
}
catch(...)
{
QMessageBox objCrashExit;
objCrashExit.information(this, "Unknown Crash", "Unknown crash exit-child process may not be running correctly!");
}
}
qTimer=新的qTimer(0);
连接(qTimer,信号(timeout()),此,插槽(RestartStoppedProcess()),Qt::DirectConnection);
connect(qTimer,SIGNAL(destrocted()),qTimer,SLOT(deleteLater()),Qt::DirectConnection);
qTimer->setTimerType(Qt::VeryCoarseTimer);
qTimer->启动(5000);
void ProcessMonitor::RestartStoppedProcess()
{
尝试
{
QProcess*objMonitorProcess=新的QProcess(此);
连接(objMonitorProcess,信号(finished(int,QProcess::ExitStatus)),objMonitorProcess,SLOT(deleteLater());
对于(int i=0;itwShowProcess->rowCount();i++)
{
#伊夫德夫奎斯林
//objMonitorProcess->start(“pidof”,QStringList()twShowProcess->item(i,0)->text()),QIODevice::ReadOnly);
objMonitorProcess->start(“pidof”+(ui->twShowProcess->item(i,0)->text()),QIODevice::ReadOnly);
#艾利夫·奎斯温
QString cmd(“wmic流程,其中”);
QString qszFilters(“\”进程ID=\”);
QString qszSubFilters=qszFilters.append(ui->twShowProcess->item(i,1)->text().append(“\”).append(“\”).append(“获取名称”);
cmd.append(qszSubFilters);
objMonitorProcess->start(cmd.toStdString().c_str(),QIODevice::ReadOnly);
#否则
QString qszProcessName=ui->twShowProcess->item(i,0)->text().split(“.”.takeFirst();
objMonitorProcess->start(“pgrep”,QStringList()waitForStarted(4000)=true)和&(objMonitorProcess->state()==QProcess::Running))
{
if(objMonitorProcess->waitForFinished(3000)=false)
持续
其他的
{
QString qszProcessStatus=ui->twShowProcess->item(i,3)->text();
if(qszProcessStatus.compare(“Running”)==0)
{
QString qszStandardOutput,qszStandardError;
qszStandardOutput.clear();qszStandardError.clear();
qszStandardOutput=QString(objMonitorProcess->readAllStandardOutput());
qszStandardError=QString(objMonitorProcess->readAllStandardError());
if(qszStandardError.simplified().compare(“没有可用的实例)”,Qt::casesensitive)==0&&qszStandardOutput.simplified().isEmpty()==true)
{
ui->twShowProcess->选择行(i);
如果(ui->twShowProcess->selectedItems().at(0)->text().compare(“LTtagdb.exe”,Qt::caseminsensitive)=0||
ui->twShowProcess->selectedItems().at(0)->text().compare(“LTmessagebroker.exe”,Qt::casesensitive)==0)
此->强制停止所有应用程序();
其他的
此->启动操作停止触发();
如果(此->ptrobjContextMenu->isVisible())
此->ptrobjContextMenu->close();
ui->twShowProcess->clearSelection();
if(mobj_ProcessLogMap.mobj_ProcessAndLogMapping.contains(ui->twShowProcess->item(i,8)->text())==true)
{
mobj_ProcessLogMap.mobj_ProcessAndLogMapping.remove(ui->twShowProcess->item(i,8)->text());
mobj_ProcessLogMap.mobj_ProcessAndLogMapping.insert(ui->twShowProcess->item(i,8)->text(),QString(“”);
}
其他的
this->mobj_ProcessLogMap.mobj_ProcessAndLogMapping.insert(ui->twShowProcess->item(i,8)->text(),QString(“”);
}
如果(ui->twShowProcess->item(i,0)->text()=“LThistdb.exe”)
{
if(IsServiceRunning(QString(“LThistdb.exe”)==false)
此->on_actionStopPostgreSQL_DB_Server_trigger();
}
qszStandardOutput.clear();
}
}
}
其他的
打破
#如果你赢了
cmd.clear();
qszFilters.clear();
qszSubFilters.clear();
#恩迪夫
}
}
捕获(QProcess::ProcessError Peror)
{
QMessageBox objCrashExit;
信息(此“崩溃”,“进程错误”返回代码:“+QString::number(pError));
}
捕获(…)
{
QMessageBox objCrashExit;
信息(此“未知崩溃”、“未知崩溃退出子进程可能未正确运行!”);
}
}
QTimer
在UI线程中运行,因此如果需要很长时间才能执行,它会阻止您的UI。一个简单的解决方案是在另一个后台线程中运行“处理”内容,在Qt中最简单的方法可能是从QTimer
调用的超时槽中这样使用:
QtConcurrent::run(yourProcessingFunction);
显然,您可以创建自己的线程并从中使用内置的
QTimer
,但这通常需要更多的工作。问题可能是由于重新启动停止进程所做的工作量
如上所述,在讨论被调用的插槽时:
它的书写方式应该是