为什么Qt制作的GUI会随着时间的推移而停滞



刚加载时,应用程序相当流畅,但随着时间的推移,gui变得越来越慢,也就是说,当我点击一个按钮时,它只会在几秒钟后生效(1或2)。

我在任务管理器中观察了这个过程,内存使用率稳定(大约5米),在我点击按钮之前,cpu使用率也是0。

我将Qt_4.8.0与visual_studio_2010一起使用。

这是因为qt-lib在windows上的效率吗?

部分代码:
/////////主窗口.h//////////

QPushButton* reloadHostsPushButton = new QPushButton("Reload Hosts");
reloadHostsPushButton->setMaximumSize(aPushButtonMaxSize);
connect(reloadHostsPushButton, SIGNAL(clicked()),
        this, SLOT(reloadHostsClicked()));
QPushButton* flushDNSPushButton = new QPushButton("Flush DNS Cache");
flushDNSPushButton->setMaximumSize(aPushButtonMaxSize);
connect(flushDNSPushButton, SIGNAL(clicked()),
        this, SLOT(flushDNSClicked()));
controlPanelLayout = new QGridLayout();
controlPanelLayout->addWidget(openHostsPushButton, 0, 0);
controlPanelLayout->addWidget(reloadHostsPushButton, 0, 1);
controlPanelLayout->addWidget(flushDNSPushButton, 0, 2);
controlPanelLayout->addWidget(quitPushButton, 1, 2);
controlPanelLayout->addWidget(aboutPushButton, 1, 1);
controlPanelLayout->addWidget(optionsPushButton, 1, 0);
controlPanel = new QWidget();
controlPanel->setLayout(controlPanelLayout);

/////////server.h//////////////flushDNSClicked()调用此///////

void Server::flushDNSCache(){
    ui_LogPanel->log("Flushing DNS cache...", UI_LogPanel::aLogRed);
    QProcess* tmp = new QProcess();
    tmp->start("ipconfig", QStringList() << "/flushdns");
    ui_LogPanel->log("DNS cache flushed!", UI_LogPanel::aLogItalic | UI_LogPanel::aLogGreen);
}

flushDNSCache()槽函数包含一个错误和一些一厢情愿的想法。尽管我不认为这会导致经济放缓。

您正在创建一个QProcess对象,但从未删除它。您正在将DNS缓存刷新的日志打印到日志中,希望一切正常。

如果你不在乎ipconfig是否成功,你可以使用QProcess::startDetached如下:

void Server::flushDNSCache(){
    ui_LogPanel->log("Flushing DNS cache...", UI_LogPanel::aLogRed);
    QProcess::startDetached("ipconfig", QStringList() << "/flushdns");
    ui_LogPanel->log("DNS cache flushed!", 
        UI_LogPanel::aLogItalic | UI_LogPanel::aLogGreen);
}

现在,您不会留下任何未删除的QProcess对象。

更好的方法是使用QProcess::execute:

void Server::flushDNSCache(){
    ui_LogPanel->log("Flushing DNS cache...", UI_LogPanel::aLogRed);
    int exitCode = QProcess::execute("ipconfig", QStringList() << "/flushdns");
    if (exitCode == 0)
    {
        ui_LogPanel->log(
            "DNS cache flushed!", 
            UI_LogPanel::aLogItalic | UI_LogPanel::aLogGreen);
    }
    else
    {
        ui_LogPanel->log(
            QString("DNS cache flush failed with exit code %1!").arg(exitCode), 
            UI_LogPanel::aLogItalic | UI_LogPanel::aLogRed);
    }
}

现在您可以检查退出代码了。但是,请注意,QProcess::execute将等待进程完成,所以如果您启动长时间运行的进程,您的应用程序将冻结,直到进程完成。

你能试试delete ing tmp吗?但是,它可能是由代码的另一部分引起的。如果你发布更多,我们可以查看。

正如_mandrill所说,许多项目(如VLC、Skype…)都在毫无问题地使用Qt。

相关内容

  • 没有找到相关文章

最新更新