c + + - Hvorfor den Qt-made GUI sidder fast med tiden?

Indlæg af Hanne Mølgaard Plasc

Problem



Når den er lige indlæst, er appen ret jævn, men med tiden forbi gui bliver langsommere og langsommere, hvilket er, når jeg klikker på en knap, træder den først i kraft efter nogle sekunder (1 eller 2).


Jeg har set processen i task manager, hukommelsen er stabil (ca. 5m), og før jeg klikker på knapperne, er cpu-brugen også 0.


Jeg bruger Qt\_4.8.0 med visual\_studio\_2010.


Er det på grund af effektiviteten af ​​qt lib på windows?


Nogle kode:

/////////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 () kalder dette/////////


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);
}

Bedste reference


Din flushDNSCache () slot funktion indeholder en fejl og nogle ønskeseddel. Selvom jeg ikke tror, ​​at det vil medføre afmatningen.


Du opretter et QProcess-objekt, men du sletter aldrig det. Og du udskriver til loggen, at DNS-cachen er skyllet og ønsker at alt gik i orden.


Hvis du ikke er i tvivl om ipconfig lykkedes, kan du bruge QProcess :: startFjern som følger: [6]


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);
}


Nu skal du ikke lade ufortolede QProcess-objekter hænge rundt.


Endnu bedre ville være at bruge QProcess :: udføre: [7]


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);
    }
}


Nu kan du tjekke exitkode. Bemærk dog, at QProcess :: execute vil vente, indtil processen er færdig, så hvis du starter lang kørsel, vil din ansøgning fryses, indtil processen er færdig.

Andre referencer 1


kan du prøve delete ing tmp? men sandsynligvis skyldes det en anden del af din kode. Vi kan gennemse det, hvis du sender mere.


Som the\_mandrill udtalte bruger mange projekter (som VLC, Skype ...) Qt uden problemer. [8]