16. november 1999 - 13:56Der er
2 kommentarer og 1 løsning
Hvorfor fryser min maskine her?
Jeg har lavet et program, hvori jeg kører en løkke. Inde i denne løkke læser poster jeg en fil og behandler data fra disse poster. Noget i retning af:
While (Not EOF(IndDataFil)) And (Not Abort = True) Do Begin Read(IndDataFil, DataPost); Lable2.Caption := DataPost.VareMaerke; FooBar; // Rutine der behandler mine data. End;
Rutinen fungere i grunden godt nok, men der er et par problemer: - Min label2.Caption bliver ikke opdateret (jo, men kun for den sidste post). - Jeg har en Abort-knap, hvis funktion er at stoppe afviklingen af løkken (Ved at sætte Abort til True). Tryk på denne knap virker på en eller anden måde ikke rigtigt - hvis jeg debugger programmet, kan jeg se at abort knappens procedure tilsyneladende først kaldes efter løækken er færdig. - Selve løkken er ca. 4-8 min om at blive færdig. I denne periode er mit program 'frosset' - fx. kan jeg ikke flytte dets window.
Det der er dit problem, er at Windows er et Event styre operativ system og at dit programs procedure, bl.a. den der håndterer din abort funktion og den der lader dig flytte dit window (ved en re-paint operation), først eksekveres når "der er tid til det". Hvornår er der så tid til det? Se, det er en længere historie - læs selv om event handling i online hjælpen og i ekstern dokumentation (Delphi og Windows bøger)- men det vigtigste i din situation er, at Windows først for lejlighed til at handle dine events når din løkke er afsluttet. Sagt på en anden måde: Så længe en procedure i dit program er aktiv, så er der ikke andre der får lov. Dette behøver du dog ikke finde dig i! Du kan (og bør) således fortælle Windows i alle tidskrævende situationer, at den kan håndtere evtuelle events, der måtte lægge klar til at blive 'handlet'. Dette gøres ved et kald til en metode fra det globale Application Object (Igen: Slå Application op i on-line hjælpen).
På denne måde sikres, at Windows kommer til fadet en gang hvor hvert løkke gennemløb. Er din FooBar rutine meget tidskrævende kan det komme på tale at sprede yderligere kald til ProcessMessages rund omkring.
du skal dog passse på med at bruge processmessages - brugeren kunne jo trykke på den knap som starter den funktion du er inde i - og så har vi balladen. Derfor, sørg for at sætte enabled til false for alle de ting som brugeren ikke må røre mens løkken kører.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.