【问题标题】:Why the Qt-made GUI gets stuck with time?为什么 Qt 制作的 GUI 会卡住时间?
【发布时间】:2012-03-04 15:56:22
【问题描述】:

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

我在任务管理器里看了下,内存使用稳定(5m左右),在我点击按钮之前,cpu使用也是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);
}

【问题讨论】:

  • 任何示例代码可以重现?
  • 肯定有其他问题。你能发布你的代码吗?
  • 可能是因为您在使用与用户界面相同的线程中运行代码。这将使应用程序看起来像在执行按钮后面的代码之前没有响应。
  • @KamilKlimek 这是一个有很多代码的项目,我发布了一些相关的代码。
  • @marcushatchenson QProcess::start() 说它将创建一个新进程。

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


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

【讨论】:

    【解决方案2】:

    你可以试试deleteing tmp 吗?但是,这可能是由您的代码的另一部分引起的。如果您发布更多内容,我们可以对其进行审核。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 2019-11-23
      • 2015-01-03
      • 2022-11-21
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      相关资源
      最近更新 更多