2012-02-13 53 views
-1

当刚加载时,应用程序相当流畅,但随着时间的推移,GUI会变得越来越慢,也就是说,当我点击一个按钮时,它只会在几秒钟后(1或2)生效。为什么Qt制作的GUI会随着时间而停滞不前?

我曾经看过在任务管理器的进程,内存使用(大约5M)稳定,在此之前我点击按钮,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); 

/////////服务器.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); 
} 
+0

任何示例代码重现? – 2012-02-13 08:14:46

+0

必须有其他错误。你可以发布你的代码吗? – mustafa 2012-02-13 08:16:19

+1

也许是因为您正在使用与用户界面相同的线程运行代码。这将使应用程序看起来像是没有响应,直到你的代码在按钮后面执行。 – kechapito 2012-02-13 08:19:01

回答

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将等待进程结束,因此如果开始长时间运行进程,则应用程序将冻结,直到进程结束。

0

可以尝试delete荷兰国际集团TMP?但是,可能它是由另一部分代码引起的。我们可以检查它,如果你发布更多。

正如The_mandrill所述,many projects(如VLC,Skype ...)正在使用Qt,没有任何问题。

相关问题