/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Manglende visning på skærm i løkker
Fra : Kurt Guldbæk


Dato : 24-02-04 20:04

Jeg har en fejl, som jeg ikke rigtig kan greje:

I forbindelse med arbejde i nogle databaser vil jeg gerne på skærmen have
vist hvor langt programmet er kommet.
I første omgang vil jeg blot vise nogle tekster i en 'Edit'.
Imidlertid vises der absolut intet i de forskellige 'Edit', ligeledes er det
svært/langsomt at stoppe programmet med CtrlAltDel.

Hvad kan grunden være?
Der anvendes Delphi5 under XP på en bærbar med LCD-display.

Noget af koden ser således ud:
While not tblIListen.Eof do
Begin
Edit1.Text := 'Laver Ejerlav.db';
KommuneNr := tblIListen.FieldByName('KommuneNr').AsString;
//Udfyld Ejerlav.db
tblKMS_Elav.First;
tblEjerlav.Open;
While not tblKMS_Elav.EOF do
Begin
Edit1.Text := tblKMS_Elav.FieldByName('KommuneNr').AsString;
If tblKMS_Elav.FieldByName('KommuneNr').AsString = KommuneNr Then
Begin //Udfyld Ejerlav.db
Edit1.Text := 'Er inde i løkken';
End;
tblKMS_Elav.Next;
End; //While
EditAntalEjerlav.Text := IntToStr(AntalEjerlav);
Edit1.Text := 'Laver Adresser.db';
//Ny kode med flere løkker her
tblIListen.Next;
End; //While

--
Med venlig hilsen
Kurt Guldbæk
www.guldbaek.net



 
 
Toke Eskildsen (24-02-2004)
Kommentar
Fra : Toke Eskildsen


Dato : 24-02-04 20:17

Kurt Guldbæk wrote:

> Imidlertid vises der absolut intet i de forskellige 'Edit',
> ligeledes er det svært/langsomt at stoppe programmet med
> CtrlAltDel.
>
> Hvad kan grunden være?

At programmet har for travlt med at knokle løs til at opdatere
grænsefladen. Smid et par Application.ProcessMessages; ind på
udvalgte steder. Det lader programmet udføre sådanne ting.
--
Toke Eskildsen - http://ekot.dk/

Kurt Guldbæk (24-02-2004)
Kommentar
Fra : Kurt Guldbæk


Dato : 24-02-04 21:40

Tak, Toke.
Jeg vil prøve at det!

--
Med venlig hilsen
Kurt Guldbæk
www.guldbaek.net
"Toke Eskildsen" <darkwing@daimi.au.dk> skrev i en meddelelse
news:Xns9499CE6D274E2tokeeskildsen@130.133.1.4...
> Kurt Guldbæk wrote:
>
> > Imidlertid vises der absolut intet i de forskellige 'Edit',
> > ligeledes er det svært/langsomt at stoppe programmet med
> > CtrlAltDel.
> >
> > Hvad kan grunden være?
>
> At programmet har for travlt med at knokle løs til at opdatere
> grænsefladen. Smid et par Application.ProcessMessages; ind på
> udvalgte steder. Det lader programmet udføre sådanne ting.
> --
> Toke Eskildsen - http://ekot.dk/



Nicolai Hansen (25-02-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 25-02-04 16:27

Toke Eskildsen <darkwing@daimi.au.dk> wrote in message news:<Xns9499CE6D274E2tokeeskildsen@130.133.1.4>...
> Kurt Guldbæk wrote:
>
> > Imidlertid vises der absolut intet i de forskellige 'Edit',
> > ligeledes er det svært/langsomt at stoppe programmet med
> > CtrlAltDel.
> >
> > Hvad kan grunden være?
>
> At programmet har for travlt med at knokle løs til at opdatere
> grænsefladen. Smid et par Application.ProcessMessages; ind på
> udvalgte steder. Det lader programmet udføre sådanne ting.

Application.ProcessMessages er desværre gået hen og blevet en løsning
på dette problem. Application.ProcessMessages laver meget andet end at
opdatere skærmen; noget af dette er ikke nødvændigvis godt.
Brug TForm.Update eller TComponent.Update istedet. Din skærm vil så
blive opdateret uden side effekter.

David Konrad (25-02-2004)
Kommentar
Fra : David Konrad


Dato : 25-02-04 19:15

"Nicolai Hansen" <nic@aub.dk> wrote in message
news:d96764ff.0402250727.731a2963@posting.google.com...

> > At programmet har for travlt med at knokle løs til at opdatere
> > grænsefladen. Smid et par Application.ProcessMessages; ind på
> > udvalgte steder. Det lader programmet udføre sådanne ting.
>
> Application.ProcessMessages er desværre gået hen og blevet en løsning
> på dette problem. Application.ProcessMessages laver meget andet end at
> opdatere skærmen; noget af dette er ikke nødvændigvis godt.

Hvad tænker du på? Den sørger da blot for at messages kan blive behandlet af
case..-strukturen?




Kurt Guldbæk (25-02-2004)
Kommentar
Fra : Kurt Guldbæk


Dato : 25-02-04 21:35



--
Med venlig hilsen
Kurt Guldbæk
www.guldbaek.net
"David Konrad" <david_konrad@hotmail.com> skrev i en meddelelse
news:c1iome$21o$1@sunsite.dk...
> "Nicolai Hansen" <nic@aub.dk> wrote in message
> news:d96764ff.0402250727.731a2963@posting.google.com...
>
> > > At programmet har for travlt med at knokle løs til at opdatere
> > > grænsefladen. Smid et par Application.ProcessMessages; ind på
> > > udvalgte steder. Det lader programmet udføre sådanne ting.
> >
> > Application.ProcessMessages er desværre gået hen og blevet en løsning
> > på dette problem. Application.ProcessMessages laver meget andet end at
> > opdatere skærmen; noget af dette er ikke nødvændigvis godt.
>
> Hvad tænker du på? Den sørger da blot for at messages kan blive behandlet
af
> case..-strukturen?
>

Muligvis, men de klarede begge to problemet for mig!

--
Med venlig hilsen
Kurt Guldbæk



Nicolai Hansen (26-02-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 26-02-04 16:38

"David Konrad" <david_konrad@hotmail.com> wrote in message news:<c1iome$21o$1@sunsite.dk>...
> "Nicolai Hansen" <nic@aub.dk> wrote in message
> news:d96764ff.0402250727.731a2963@posting.google.com...
>
> > > At programmet har for travlt med at knokle løs til at opdatere
> > > grænsefladen. Smid et par Application.ProcessMessages; ind på
> > > udvalgte steder. Det lader programmet udføre sådanne ting.
> >
> > Application.ProcessMessages er desværre gået hen og blevet en løsning
> > på dette problem. Application.ProcessMessages laver meget andet end at
> > opdatere skærmen; noget af dette er ikke nødvændigvis godt.
>
> Hvad tænker du på? Den sørger da blot for at messages kan blive behandlet af
> case..-strukturen?

Ja - og det er sjældent ønskeligt at behandle andre messages end skærm
optgning hvis du sidder i et lukket loop.

Se tråden "kørsel uden brugerindgreb" på google:
http://groups.google.com/groups?dq=&hl=da&lr=&ie=UTF-8&threadm=X1yPb.3932%246q5.784%40news.get2net.dk&prev=/groups%3Fdq%3D%26num%3D25%26hl%3Dda%26lr%3D%26ie%3DUTF-8%26group%3Ddk.edb.programmering.pascal%26start%3D25

David Konrad (26-02-2004)
Kommentar
Fra : David Konrad


Dato : 26-02-04 19:35

"Nicolai Hansen" <nic@aub.dk> wrote in message
news:d96764ff.0402260738.2f90cdc8@posting.google.com...

> > Hvad tænker du på? Den sørger da blot for at messages kan blive
behandlet af
> > case..-strukturen?
>
> Ja - og det er sjældent ønskeligt at behandle andre messages end skærm
> optgning hvis du sidder i et lukket loop.
>
> Se tråden "kørsel uden brugerindgreb" på google:
>
http://groups.google.com/groups?dq=&hl=da&lr=&ie=UTF-8&threadm=X1yPb.3932%246q5.784%40news.get2net.dk&prev=/groups%3Fdq%3D%26num%3D25%26hl%3Dda%26lr%3D%26ie%3DUTF-8%26group%3Ddk.edb.programmering.pascal%26start%3D25

Det er helt rigtigt hvad du skriver, jeg synes blot det er lidt spekulativt
ift almindelig opdatering af skærmbilledet i et objekt orienteret delphi
program. Hvornår vil man nogen sinde bruge globale variable i en løkke?



Nicolai Hansen (26-02-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 26-02-04 22:51

> Det er helt rigtigt hvad du skriver, jeg synes blot det er lidt
spekulativt
> ift almindelig opdatering af skærmbilledet i et objekt orienteret delphi
> program. Hvornår vil man nogen sinde bruge globale variable i en løkke?

Erm, det er skam da tit at man bruger globale variable (eller object
variable), eller eksterne data, i en løkke. Databaser må da ihvertfald siges
at være ret globale og ofte indgå i de lange tidskrævende processer hvor
folk indsætter et kald til messagehandleren. Og så har man en knap til at
opdatere og en anden knap til at slette, man trykker gladeligt på dem begge
og -vupti- ens program er i en udefineret tilstand, giver et lidt
små-tilfældigt resultat, og værst af alt, man kan ikke genskabe situationen
....






David Konrad (27-02-2004)
Kommentar
Fra : David Konrad


Dato : 27-02-04 10:09

"Nicolai Hansen" <nic@aub.dk> wrote in message
news:403e6a71$0$27373$edfadb0f@dread16.news.tele.dk...
> > Det er helt rigtigt hvad du skriver, jeg synes blot det er lidt
> spekulativt
> > ift almindelig opdatering af skærmbilledet i et objekt orienteret delphi
> > program. Hvornår vil man nogen sinde bruge globale variable i en løkke?
>
> Erm, det er skam da tit at man bruger globale variable (eller object
> variable), eller eksterne data, i en løkke.

Well, det er muligt du gør, men det er da i strid med den grundlæggende
programmerings-ABC. Det er jo, af nøjagtig de årsager du nævner, en
fejlkilde som er helt unødvendig at belemre sig selv med. Hvad skal man
bruge en global variabel til i en løkke, hvor en lokal variabel ikke kan
bruges? Den globale variabel er jo under alle omstændigheder "låst" medens
løkken kører, eftersom ændringer på den globale variable uden for løkken jo
ødelægger selve løkkens logik - evt værdier som skal fremkomme ud af løkken
(opdatering af data, f.eks, ift løkkens status) bør da alligevel ske i form
af en event som formidler kopier af data.

> Databaser må da ihvertfald siges
> at være ret globale og ofte indgå i de lange tidskrævende processer hvor
> folk indsætter et kald til messagehandleren.

Ja - men det er jo ikke count(*) eller andre værdier *i* databasen du bruger
som løkketæller i dit eksempel, og det er svært at se hvornår det
overhovedet skulle være nødvendigt direkte at bruge værdier fra en database
i en løkke-counter. Jeg kan kun se ét scenarie hvor kald til
messagehandleren er dårligt at kalde slavisk, og det er under
realtidsprogrammering - og da bør man *alligevel* bruge lokale variable,
naturligvis.

>Og så har man en knap til at
> opdatere og en anden knap til at slette, man trykker gladeligt på dem
begge
> og -vupti- ens program er i en udefineret tilstand, giver et lidt
> små-tilfældigt resultat, og værst af alt, man kan ikke genskabe
situationen

Hvis man insisterer på at gøre livet surt for sig selv kan man da godt - det
var blot netop den slags, det var intentionen med OOP at undgå. Det virker i
høj grad som om du vil programmere ustruktureret i et OOP-program, og heller
ikke vil bruge de instrumenter indenfor OOP som oprindelig var tiltænkt den
funktion, at de skulle gøre livet lettere for programmøren ift de klassiske
fejlkilder, som uværgerligt opstår ved ustruktueret programmering



Nicolai Hansen (28-02-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 28-02-04 21:30

> Hvis man insisterer på at gøre livet surt for sig selv kan man da godt -
det
> var blot netop den slags, det var intentionen med OOP at undgå. Det virker
i
> høj grad som om du vil programmere ustruktureret i et OOP-program, og
heller
> ikke vil bruge de instrumenter indenfor OOP som oprindelig var tiltænkt
den
> funktion, at de skulle gøre livet lettere for programmøren ift de
klassiske
> fejlkilder, som uværgerligt opstår ved ustruktueret programmering

Jamen dog :) Jeg programmerer skam ret struktureret. Jeg åbner bare ikke
mine programmer for unødvændige fejlkilder og gør alt for at synkronisere
dem 100%. Det er vist god programmerings skik.

Lad mig give et OOC eksempel på det der er nævnt i den anden tråd:
Du laver et rumskibsskydespil. Du har to knapper - en til at dreje rumskibet
mod højre, og en til at dreje det mod venstre. Du drejer begge retninger vha
en lille animation. Den tager tid, og du bruger Application.ProcessMessages
for at få skærmen optegnet.
Du drejer mod højre. I dit objekt ligger der en "FGrader" som er din vinkel
... denne incrementeres langsomt i dit loop indtil den når en fast værdi (90
grader). Du fortryder. Klikker på venstre knappen. Nu decrementeres din
FGrader i objektet langsomt. Den når sit max udsving (-90 grader). Rutinen
er færdig. Ryger tilbage til højre drejningen, og drejer helt over til +90
grader igen.

Det der BURDE være sket var enten at du drejede først helt til højre,
dernæst helt til venstre.

Bare et lille tænkt eksempel - ja der er smartere måder at gøre dette på.




David Konrad (01-03-2004)
Kommentar
Fra : David Konrad


Dato : 01-03-04 01:46

"Nicolai Hansen" <nic@aub.dk> wrote in message
news:4040fa46$0$27400$edfadb0f@dread16.news.tele.dk...
> > Hvis man insisterer på at gøre livet surt for sig selv kan man da godt -
> det
> > var blot netop den slags, det var intentionen med OOP at undgå. Det
virker
> i
> > høj grad som om du vil programmere ustruktureret i et OOP-program, og
> heller
> > ikke vil bruge de instrumenter indenfor OOP som oprindelig var tiltænkt
> den
> > funktion, at de skulle gøre livet lettere for programmøren ift de
> klassiske
> > fejlkilder, som uværgerligt opstår ved ustruktueret programmering
>
> Jamen dog :) Jeg programmerer skam ret struktureret. Jeg åbner bare ikke
> mine programmer for unødvændige fejlkilder og gør alt for at synkronisere
> dem 100%. Det er vist god programmerings skik.

Ja - jeg påstår skam heller intet af slig slags overhovedet, det var bare et
interessant synspunkt du lagde for dagen.

> Lad mig give et OOC eksempel på det der er nævnt i den anden tråd:
> Du laver et rumskibsskydespil. Du har to knapper - en til at dreje
rumskibet
> mod højre, og en til at dreje det mod venstre. Du drejer begge retninger
vha
> en lille animation. Den tager tid, og du bruger
Application.ProcessMessages
> for at få skærmen optegnet.

Det ville jeg nu ikke....

> Du drejer mod højre. I dit objekt ligger der en "FGrader" som er din
vinkel
> .. denne incrementeres langsomt i dit loop indtil den når en fast værdi
(90
> grader). Du fortryder. Klikker på venstre knappen. Nu decrementeres din
> FGrader i objektet langsomt. Den når sit max udsving (-90 grader). Rutinen
> er færdig. Ryger tilbage til højre drejningen, og drejer helt over til +90
> grader igen.
> Det der BURDE være sket var enten at du drejede først helt til højre,
> dernæst helt til venstre.
>
> Bare et lille tænkt eksempel - ja der er smartere måder at gøre dette på.
>
Jeg forstår godt hvad du beskriver. Jeg ved ikke hvordan du ville
implementere det, men jeg ville have en særskilt tråd for keyboard/joystick,
whatever, som uophørligt aflæste brugerens input - lad os blot sige
keyboardstate. Ved siden af ville jeg jeg have en proces, en "styreoproces"
der tog imod input formidlet af denne tråd, evt eksekveret direkte som kald
eller via messages, i en kø, som foretager den bagvedliggende kontrol eller
logik. Skærmen opdateres blot kontinuerligt - f.eks på tid, lad os sige 2
gange i sekundet, hvadenten brugeren har foretaget et input eller ej. Flowet
i programmet ser således ud, SU er skærmopdatering

|-->aflæs evt input-->kald "styreproces" ->tæl ned/op=højre venstre-|
|<--------------------------------------------------------------------------
------------------|
SU SU SU SU
SU

Opdatering af skærm sker uafhængigt - "print"-rutinen danner skærmbilledet
ud fra værdier den læser på objekter, blandt andet styreprocessen og i
lookuplister. De enkelte input (højre/venstre) udelukker ikke hinanden -
højre/venstre ligger ikke i særskilte rutiner eller eksekveres separat - der
eksekveres blot fortløbende og øjeblikkeligt ordren til en kø om at gå til
højre eller venstre, og det ændrer blot en værdi, nemlig FGrader, i
styreprocessen - reaktionen ses først når skærmen opdateres. Hvordan det
virker eller "tager sig ud" ift din beskrivelse, afhænger så af den
reaktionshastighed man ønsker - man kan vælge at aflæse tastaturet med
standard repeatrate etc som det er, eller sætte den efter en
følsomhedsskala, endda én som brugeren måske kan få lov at indstille - det
samme mht joystick og mus. Det kan betyde, rent virkningsmæssigt/visuelt, at
rumskibet ikke reagerer præcis med det samme, men lissom' skal bruge energi
på at stoppe den allerede begyndte drejning og nu dreje modsat - men det kan
også præsenteres som om brugeren kan dreje og reagere knivskarpt og hurtigt,
hvis man sætter inputaflæsningshastigheden en smule ned, da mængden af
ordrer til køen dermed bliver mindre.



Nicolai Hansen (01-03-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 01-03-04 07:58

> > Bare et lille tænkt eksempel - ja der er smartere måder at gøre dette på.

^^ *peger opad*

> Jeg forstår godt hvad du beskriver. Jeg ved ikke hvordan du ville
> implementere det, men jeg ville have en særskilt tråd for keyboard/joystick,
> whatever, som uophørligt aflæste brugerens input - lad os blot sige
> keyboardstate.

Jeg tror nu ikke jeg ville køre det i en tråd sådan umiddelbart - der
ville skule en del synkronisering og semaphorer til (ellers ville du
_måske_ kunne gøre ting som at styre dit rumskib efter du var blevet
skudt ned og den slags); dette er en pinsel. Men jeg har ikke tænkt så
meget over det - ville bare give et eksempel på at kald til
messagehandleren i lukkede loops kan give problemer, også i OO kode.

Nicolai Hansen (01-03-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 01-03-04 13:40

Jeg har lige nuppet det her fra comp.lang.pascal.delphi.misc's FAQ:


11. When my program is in a loop it doesn't respond to user input or update
its display. Can I change this?

Yes. In your loop you need to add a call to the Application.ProcessMessages
method. This will allow your application to process Windows messages,
including those generated by user actions. There are two significant
caveats. First, since Windows messages often translate into calls to
event handlers your program may begin to do things at inappropriate
times. Make sure that the user can't initiate actions that will interfere
with the loop while the loop is active. In particular, note the following
sentence, taken from Delphi 3's help file on TApplication.Terminated:
"For applications using calculation-intensive loops, call
Application.ProcessMessages periodically, and also check
Application.Terminated to determine whether or not to abort
the calculation so that the application can terminate."
The second caveat is that calling Application.ProcessMessages can be
relatively expensive and may slow the program. In a fast (tight) loop
you may not want to call the method on each iteration. If you only want
to update the display and not handle user input you can use the Update
method (Delphi 3 and up) of the control covering the part of the display
you want to update. Remember that this will also slow down the loop!


Det beskriver nok meget godt situationen.

Toke Eskildsen (26-02-2004)
Kommentar
Fra : Toke Eskildsen


Dato : 26-02-04 00:51

Nicolai Hansen wrote:

> Application.ProcessMessages er desværre gået hen og blevet en
> løsning på dette problem. Application.ProcessMessages laver meget
> andet end at opdatere skærmen; noget af dette er ikke nødvændigvis
> godt.

Nu har jeg selv for vane at sætte den ind forskellige steder, så jeg
vil gerne høre hvad der er af problemer med den?

> Brug TForm.Update eller TComponent.Update istedet. Din skærm
> vil så blive opdateret uden side effekter.

Hvad med muse- og tastaturbegivenheder?
--
Toke Eskildsen - http://ekot.dk/

Nicolai Hansen (26-02-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 26-02-04 16:36

Toke Eskildsen <darkwing@daimi.au.dk> wrote in message news:<Xns949B899E9BABtokeeskildsen@130.133.1.4>...
> Nicolai Hansen wrote:
>
> > Application.ProcessMessages er desværre gået hen og blevet en
> > løsning på dette problem. Application.ProcessMessages laver meget
> > andet end at opdatere skærmen; noget af dette er ikke nødvændigvis
> > godt.
>
> Nu har jeg selv for vane at sætte den ind forskellige steder, så jeg
> vil gerne høre hvad der er af problemer med den?

Jeg skrev angående dette tidligere - Application.ProcessMessages kører
programmets message loop igennem. Hvis der kommer nye muse/taste tryk
mens dit loop kører vil Appl.ProcessMsgs handle disse tryk. Det er jo
fint nok, nogle gange er det ønskeligt :)
Problemet opstår fordi Appl.ProcessMsgs åbner mulighed for at starte
samme lange løkke igen. Og igen. Og igen. Indtil du får dig et stack
overflow.

Personligt synes jeg Appl.ProcessMsgs er en rigtig dårlig ide med
mindre du har 100% kontrol over din message handler (du har sat
Application.OnMessage:=MyMessageHandler; og programmeret den selv). Du
får hurtig noget asynkron programmering ud af det. Og i 99% af
tilføldende vil TForm.Update gøre jobbet for dig.

> > Brug TForm.Update eller TComponent.Update istedet. Din skærm
> > vil så blive opdateret uden side effekter.
>
> Hvad med muse- og tastaturbegivenheder?

Disse bliver ikke handlet. Det er sjældent ønskeligt at behandle
musetryk inde i et loop. Ellers vil jeg foreslå PeekMessage.

Toke Eskildsen (26-02-2004)
Kommentar
Fra : Toke Eskildsen


Dato : 26-02-04 21:25

Nicolai Hansen wrote:

> Problemet opstår fordi Appl.ProcessMsgs åbner mulighed for at
> starte samme lange løkke igen. Og igen. Og igen. Indtil du får dig
> et stack overflow.

Ah, okay. Jeg har så en anden vane der går ud på at disable de menuer,
knapper o.l. der kan sætte kritiske ting i gang, når jeg kalder større
metoder (som er de eneste jeg sætter Appl.Proc. ind i). Cancel knappen
efterlades selvfølgelig enabled, hvis der er sådan en.

> Og i 99% af tilføldende vil TForm.Update gøre jobbet for dig.

Ovenfor nævnte Cancel-knap er vel en rimelig udbredt ting?


Men det kan være det bare er vores programmeringsmåder der er
forskellige. Før denne tråd havde jeg slet ikke overvejet at ignorere
(eller queue) messages i en messagehandler, når der laves større ting.
--
Toke Eskildsen - http://ekot.dk/

Nicolai Hansen (26-02-2004)
Kommentar
Fra : Nicolai Hansen


Dato : 26-02-04 22:56

> > Problemet opstår fordi Appl.ProcessMsgs åbner mulighed for at
> > starte samme lange løkke igen. Og igen. Og igen. Indtil du får dig
> > et stack overflow.
>
> Ah, okay. Jeg har så en anden vane der går ud på at disable de menuer,
> knapper o.l. der kan sætte kritiske ting i gang, når jeg kalder større
> metoder (som er de eneste jeg sætter Appl.Proc. ind i). Cancel knappen
> efterlades selvfølgelig enabled, hvis der er sådan en.

Det er en god vane :)

> > Og i 99% af tilføldende vil TForm.Update gøre jobbet for dig.
>
> Ovenfor nævnte Cancel-knap er vel en rimelig udbredt ting?

Det kommer an på hvad man programmerer. Hvis man opdaterer en stor database
er en cancel knap nok ikke en smart ting. Cancel knapper kan dog også klares
med lidt PeekMessage.

> Men det kan være det bare er vores programmeringsmåder der er
> forskellige. Før denne tråd havde jeg slet ikke overvejet at ignorere
> (eller queue) messages i en messagehandler, når der laves større ting.

Det kommer meget an på hvad der laves. Men generelt vil jeg mene at HVIS man
har en grund til at bruge Application.MessageHandler burde man nok køre sin
process i en tråd istedet. Jeg ved så godt at det ikke er det allernemmeste
i verden :)




Kurt Guldbæk (26-02-2004)
Kommentar
Fra : Kurt Guldbæk


Dato : 26-02-04 23:26


"Nicolai Hansen" <nic@aub.dk> skrev i en meddelelse
news:403e6ba0$0$27438$edfadb0f@dread16.news.tele.dk...
> > > Problemet opstår fordi Appl.ProcessMsgs åbner mulighed for at
> > > starte samme lange løkke igen. Og igen. Og igen. Indtil du får dig
> > > et stack overflow.
> >
> > Ah, okay. Jeg har så en anden vane der går ud på at disable de menuer,
> > knapper o.l. der kan sætte kritiske ting i gang, når jeg kalder større
> > metoder (som er de eneste jeg sætter Appl.Proc. ind i). Cancel knappen
> > efterlades selvfølgelig enabled, hvis der er sådan en.
>
> Det er en god vane :)
>
> > > Og i 99% af tilføldende vil TForm.Update gøre jobbet for dig.
> >
> > Ovenfor nævnte Cancel-knap er vel en rimelig udbredt ting?
>
> Det kommer an på hvad man programmerer. Hvis man opdaterer en stor
database
> er en cancel knap nok ikke en smart ting. Cancel knapper kan dog også
klares
> med lidt PeekMessage.
>
> > Men det kan være det bare er vores programmeringsmåder der er
> > forskellige. Før denne tråd havde jeg slet ikke overvejet at ignorere
> > (eller queue) messages i en messagehandler, når der laves større ting.
>
> Det kommer meget an på hvad der laves. Men generelt vil jeg mene at HVIS
man
> har en grund til at bruge Application.MessageHandler burde man nok køre
sin
> process i en tråd istedet. Jeg ved så godt at det ikke er det
allernemmeste
> i verden :)
>

Og så et sikkert dumt spørgsmål:
Hvad er det at køre sin process i en tråd?
Og hvordan gør man det?
Hvad er fordelen?
Jeg mindes ikke at have set noget om det!

--
Med venlig hilsen
Kurt Guldbæk
www.guldbaek.net



Harald (26-02-2004)
Kommentar
Fra : Harald


Dato : 26-02-04 23:43

"Kurt Guldbæk" <kurt_g@guldbaek.net> skrev i en meddelelse
news:403e72cd$0$27468$edfadb0f@dread16.news.tele.dk...
>
> "Nicolai Hansen" <nic@aub.dk> skrev i en meddelelse
> news:403e6ba0$0$27438$edfadb0f@dread16.news.tele.dk...
> > > > Problemet opstår fordi Appl.ProcessMsgs åbner mulighed for at
> > > > starte samme lange løkke igen. Og igen. Og igen. Indtil du får dig
> > > > et stack overflow.
> > >
> > > Ah, okay. Jeg har så en anden vane der går ud på at disable de menuer,
> > > knapper o.l. der kan sætte kritiske ting i gang, når jeg kalder større
> > > metoder (som er de eneste jeg sætter Appl.Proc. ind i). Cancel knappen
> > > efterlades selvfølgelig enabled, hvis der er sådan en.
> >
> > Det er en god vane :)
> >
> > > > Og i 99% af tilføldende vil TForm.Update gøre jobbet for dig.
> > >
> > > Ovenfor nævnte Cancel-knap er vel en rimelig udbredt ting?
> >
> > Det kommer an på hvad man programmerer. Hvis man opdaterer en stor
> database
> > er en cancel knap nok ikke en smart ting. Cancel knapper kan dog også
> klares
> > med lidt PeekMessage.
> >
> > > Men det kan være det bare er vores programmeringsmåder der er
> > > forskellige. Før denne tråd havde jeg slet ikke overvejet at ignorere
> > > (eller queue) messages i en messagehandler, når der laves større ting.
> >
> > Det kommer meget an på hvad der laves. Men generelt vil jeg mene at HVIS
> man
> > har en grund til at bruge Application.MessageHandler burde man nok køre
> sin
> > process i en tråd istedet. Jeg ved så godt at det ikke er det
> allernemmeste
> > i verden :)
> >
>
> Og så et sikkert dumt spørgsmål:
> Hvad er det at køre sin process i en tråd?
> Og hvordan gør man det?
> Hvad er fordelen?
> Jeg mindes ikke at have set noget om det!

Det er faktisk ikke så svært at lave tråde, kik i delphi hjælp efter TThread
og læs også her:
http://www.pergolesi.demon.co.uk/prog/threads/ToC.html

Mvh
HK



Tom-Vidar Nilsen (27-02-2004)
Kommentar
Fra : Tom-Vidar Nilsen


Dato : 27-02-04 00:19

> > Nicolai Hansen wrote:
> >
> > > Application.ProcessMessages er desværre gået hen og blevet en
> > > løsning på dette problem. Application.ProcessMessages laver meget
> > > andet end at opdatere skærmen; noget af dette er ikke nødvændigvis
> > > godt.
> >
> > Nu har jeg selv for vane at sætte den ind forskellige steder, så jeg
> > vil gerne høre hvad der er af problemer med den?
>
> Jeg skrev angående dette tidligere - Application.ProcessMessages kører
> programmets message loop igennem. Hvis der kommer nye muse/taste tryk
> mens dit loop kører vil Appl.ProcessMsgs handle disse tryk. Det er jo
> fint nok, nogle gange er det ønskeligt :)
> Problemet opstår fordi Appl.ProcessMsgs åbner mulighed for at starte
> samme lange løkke igen. Og igen. Og igen. Indtil du får dig et stack
> overflow.
>
> Personligt synes jeg Appl.ProcessMsgs er en rigtig dårlig ide med
> mindre du har 100% kontrol over din message handler (du har sat
> Application.OnMessage:=MyMessageHandler; og programmeret den selv). Du
> får hurtig noget asynkron programmering ud af det. Og i 99% af
> tilføldende vil TForm.Update gøre jobbet for dig.

Jeg forstår godt hva du mener og er klar over problemene som kan oppstå, men
om jeg kjører en oppdatering som tar for eks. 30 sekunder og ikke kaller
Appl.ProcessMsgs vil det for
brukeren se ut som programmet henger.
Selv med timeglass cursor kan det hende brukeren trykker avslutt , og W2K/XP
vil da si at programmet henger og spørre om det skal avsluttes.

Folk forventer seg å kunne flytte, minimere eller få respons fra programmet
selv i en loop.
Jeg driver ikke med databaser (normalt) så jeg sørger for å disable knapper
osv. og har ikke noe problemer med globale data da de holdes på ett minimum.

Om ønskelig kan en jo disable hele formen så lenge.

Ofte har jeg også noen timere og TCP/IP eller seriel komunikasjon som går i
bakgrunnen uten at hovedprogrammet har egne ståder for behandling av
dataene. Det er uproblematisk.

I en del programmer bruker jeg Application.OnIdle for å utføre ting i
bakgrunnen, som for eksempel store utregninger som kan brytes i småbiter
eller innsamling av data, f.eks. MP3 tags.

Dette kan være svært nyttig når brukeren har mulighet for å endre
forusettningene når han vil, f.eks bytte disk katalog.
OnIdle rutinen får da nye oppgaver som utføres straks det er ledig tid.
Om brukeren stadig bytter katalog med tusenvis av filer slipper han å vente
på at alle data skal komme på plass, responsen blir svært bra, og
innsamlingen avbrytes umiddelbart ved skifte.

Ta en lang fil liste med bilder.
Om brukeren skroller gjennom 30 filnavn i sekundet oppdateres bare
forhåndsvisningen av de bildene OnIdle rekker å vise, med straks brukeren
slipper knappen stopper den på riktig bilde.
Dette får programmene mine til å virke svært raske.
Metoden anbefales.

Brukeren merker bare at dataene på skjermen oppdateres, alle andre
funksjoner forsetter.

Globale data må selvsagt behandles forsiktig i alle tilfelle, selv uten bruk
av Appl.ProcessMsgs.
Det er også lett å lage programmer med masse unødvendige globale variable,
det er dårlig programmering.

> > > Brug TForm.Update eller TComponent.Update istedet. Din skærm
> > > vil så blive opdateret uden side effekter.

I en mindre loop som varer få sekunder er jeg enig.

F.eks.

For i:=0 To 10000 Do Begin
dosomething;
Label.Caption:=IntToStr(i);
Label1.Paint;
End;

> > Hvad med muse- og tastaturbegivenheder?
>
> Disse bliver ikke handlet. Det er sjældent ønskeligt at behandle
> musetryk inde i et loop. Ellers vil jeg foreslå PeekMessage.

Se over.



Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409080
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste