为什么Qt制造的GUI会随着时间的推移而陷入困境?

时间:2012-02-13 08:11:43

标签: c++ windows visual-studio qt user-interface

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

我在任务管理器中查看过程,内存使用情况稳定(大约5米),在点击按钮之前,cpu使用率也为0.

我正在使用Qt_4.8.0和visual_studio_2010。

是不是因为windows上qt lib的效率?

一些代码:
///////// mainwindow.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);
}

2 个答案:

答案 0 :(得分:1)

您的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将等到进程完成,因此如果您启动长时间运行的进程,您的应用程序将冻结,直到进程完成。

答案 1 :(得分:0)

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

正如the_mandrill所说,many projects(像VLC,Skype ......)正在使用Qt而没有问题。