Avatar billede egemar Nybegynder
16. november 1999 - 13:56 Der 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.

Hvad er forklaringen på det?

PS: Fedt forum det her!
Avatar billede delphi Nybegynder
16. november 1999 - 14:07 #1
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).

I det aktuelle eksempel skriver du:

  ..
  Lable2.Caption := ....
  Application.ProcessMessages;
  FooBar;
  ..

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.

NiP/Delphi

PS: Jeps - fedt medie...
Avatar billede egemar Nybegynder
16. november 1999 - 14:10 #2
Mange tak for svaret. 

ProcessMessages løser mit problem.  Hvilke bøger er iøvrigt gode, når vi snakker om Delphi?
Avatar billede lrj Nybegynder
16. november 1999 - 16:25 #3
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester