2012-02-13 56 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,沒有任何問題。

相關問題