如何启动QTimer以使GUI不挂起-RestartStoppedProcess()-代码

如何启动QTimer以使GUI不挂起-RestartStoppedProcess()-代码,qt,qtimer,Qt,Qtimer,我在类的ctor中创建了新的QTimer对象。当应用程序启动时,计时器也会在指定的时间启动。此计时器跟踪所有进程id,如果发现某个特定进程id未处于活动状态(从任务管理器终止),则会重新启动该特定进程。现在的问题是,由于这个QTimer对象,我的应用程序有点滞后,只有在超时之后,应用程序才会变得平滑。但5秒后,计时器再次启动,应用程序再次开始滞后。除了类的ctor之外,启动QTimer对象的最佳选择是什么 qTimer = new QTimer(0); connect(qTimer, SIGN

我在类的ctor中创建了新的QTimer对象。当应用程序启动时,计时器也会在指定的时间启动。此计时器跟踪所有进程id,如果发现某个特定进程id未处于活动状态(从任务管理器终止),则会重新启动该特定进程。现在的问题是,由于这个QTimer对象,我的应用程序有点滞后,只有在超时之后,应用程序才会变得平滑。但5秒后,计时器再次启动,应用程序再次开始滞后。除了类的ctor之外,启动QTimer对象的最佳选择是什么

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
,但这通常需要更多的工作。

问题可能是由于
重新启动停止进程所做的工作量

如上所述,在讨论被调用的插槽时:

它的书写方式应该是