Почему созданный Qt GUI застревает со временем? - PullRequest
0 голосов
/ 13 февраля 2012

При загрузке приложение работает довольно плавно, однако с течением времени графический интерфейс становится все медленнее и медленнее, то есть, когда я нажимаю кнопку, он вступает в силу только через несколько секунд (1 или 2).

Я наблюдал за процессом в диспетчере задач, использование памяти стабильно (около 5 м), и, прежде чем я нажимаю кнопки, загрузка процессора также равна 0.

Я использую Qt_4.8.0 с visual_studio_2010.

Это из-за эффективности qt lib на windows?

Некоторые коды:
/////////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 ]

1 голос
/ 13 февраля 2012

Ваша слот-функция 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 голосов
/ 13 февраля 2012

вы можете попробовать delete ing tmp? но, вероятно, это вызвано другой частью вашего кода. мы можем рассмотреть его, если вы отправите больше.

Как указано в the_mandrill, многие проекты (например, VLC, Skype ...) используют Qt без проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...