2012-02-13 13 views
-1

ちょうど読み込まれると、アプリはかなりスムーズですが、時間が経過するとGUIは遅くなり、ボタンをクリックすると数秒(1または2)後に有効になります。Qt製のGUIが時間を浪費するのはなぜですか?

私は、タスクマネージャでプロセスを見ている、メモリ使用量は、(5メートル前後)安定している、と私はボタンをクリックする前に、CPU使用率も0

である私はvisual_studio_2010でQt_4.8.0を使用しています。

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は()あなたはTMPをINGのdeleteを試すことができます

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

再生するサンプルコードはありますか? –

+0

何か間違っているはずです。あなたのコードを投稿できますか? – mustafa

+1

おそらく、ユーザーインターフェイスで同じスレッドを使用してコードを実行しているからです。これは、ボタンの背後にあるコードが実行されるまで、アプリケーションが応答していないように見せます。 – kechapito

答えて

1

flushDNSCache()スロット関数にはバグと希望的な考えが含まれています。私はそれが減速を引き起こすとは思わないが。

QProcessオブジェクトを作成していますが、削除することはありません。また、ログには、DNSキャッシュがフラッシュされて印刷され、すべてが正常に行われることを願っています。

次のようにあなたがQProcess::startDetachedを使用することができ、IPCONFIGが成功したかどうか気にしない場合:

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

/////////これを呼び出しますか?しかし、おそらくそれはあなたのコードの別の部分によって引き起こされます。あなたがもっと投稿したらそれを見直すことができます。

the_mandrillが述べたように、many projects(VLC、Skypeなど)は問題なくQtを使用しています。

関連する問題