Toon posts:

[c++ QT] Window refreshen (repainten)?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste mensen,

Ik heb een leuk appje met daarin een KProcess (of QProcess, wat je wil). Daarmee start ik een langlopend (ongeveer 5 minuten) programma, dat een bestand aanmaakt. Om dit proces te kunnen monitoren, bekijk ik elke 5 seconden de grootte van dat bestand:

code:
1
2
3
4
5
6
while (proc.isRunning()){
  string fileSizeCmd = "stat -c %s " + targetFile + " > /tmp/filesize";
  system(fileSizeCmd.c_str());                              
  lblStatus->setText(file2string("/tmp/filesize"));
  system("rm -f /tmp/filesize");
}


Het proces wordt opgestart op het moment dat de user op "Start!" klikt, en vervolgens komt het programma in een loop terecht, waarin de filesize in een QLabel wordt gezet (lblStatus). Echter, dit gaat niet goed... De gebruiker zal de indruk krijgen dat de applicatie crasht, omdat het venster een grijze 'veeg' over zich heen krijgt. Het label wordt namelijk wel ingesteld, maar als het ware niet opnieuw getekend. Is er een alternatieve manier om dit te doen? Google en GoT maken me niet veel wijzer...

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Dit komt waarschijnlijk omdat terwijl jij in je while() zit de event queue niet aan bod komt. Je kunt dit denk ik beter oplossen met een QTimer:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Blaat : QObject
{
    KProcess *proc;
    QTimer *d_timer;
public:
    Blaat()
    {
        d_timer = new QTimer( this);
        connect( d_timer, SIGNAL( timeout()), this, SLOT( checkfs()));
    }

    void runproc()
    {
        // KProcess opzetten etc.

        d_timer->start( 5000, FALSE);
        // Nu wordt elke 5 sec checkfs() aangeroepen.
    }
public slots:
    void checkfs()
    {
        if ( proc->isRunning())
            // doe je ding
        else
            // nu hoeft checkfs() niet meer aangeroepen te worden.
            d_timer->stop();
    }
}

Dit is even uit het hoofd, maar zou het idee duidelijk moeten maken.

Verder, heb je een speciale reden om system("stat ...") te gebruiken? De functie stat() (of QFile gebruiken) lijkt me beter. En het proces dat je runt, geeft dat geen output? Dan zou je namelijk gewoon kunnen connecten aan het receivedStdout() signal van KProcess.

"He took a duck in the face at two hundred and fifty knots."


Verwijderd

Topicstarter
Bedankt voor je reactie, ik snap de denkwijze, en het lijkt me een stap in de goede richting, maar het wekrt nog niet helemaal...
Op deze code:
code:
1
connect( d_timer, SIGNAL( timeout()), this, SLOT( checkfs()));

krijg ik een compile-error:
error: invalid conversion from `QTimer*' to `int'
error: cannot convert `const char*' to `const sockaddr*' for argument `2' to `int connect(int, const sockaddr*, unsigned int)'
Waar ik eigenlijk weinig van snap :( Misschien dat iemand hier wat aan heeft?
Verder, heb je een speciale reden om system("stat ...") te gebruiken? De functie stat() (of QFile gebruiken) lijkt me beter. En het proces dat je runt, geeft dat geen output? Dan zou je namelijk gewoon kunnen connecten aan het receivedStdout() signal van KProcess.
Euhm, dat system(...) gebruik ik op dit moment tijdelijk, omdat ik eerst wil zien of het 'idee' werkt. Als dat zo is, dan zal ik gaan kijken naar stat() of QFile. Wat betreft die KProcess, ik heb geprobeerd om daar 'connect' bij te gebruiken:
code:
1
2
connect(&proc, SIGNAL(receivedStdout(KProcess *, char *, int)), this, SLOT(receivedProcessOutput(KProcess *, char *, int)));
connect(&proc, SIGNAL(processExited(KProcess *)), this, SLOT(receivedProcessExited(KProcess *)));


Maar ook daar krijg ik die twee errors (zie boven) op... Dus vandaar dat ik nog niet zo ver gekomen was ;). Maar nu wordt het dus toch tijd om die foutmeldingen op te lossen, maar zelf snap ik weinig van die meldingen... Terwijl ik de code vergeleken heb met werkende voorbeelden van QT, en die schijnt overeen te komen :? Dan zou het toch moeten werken?

[ Voor 3% gewijzigd door Verwijderd op 18-04-2004 20:21 ]


  • Remenic
  • Registratie: Juni 2001
  • Laatst online: 12-12-2025
probeer eens QObject::connect(...), zodat hij weet dat je de connect() van QObject wilt.

Nu roep je de connect() functie aan uit socket.h :)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Tip: QFileInfo::size

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein