/ 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
Message loop?
Fra : Klaus Petersen


Dato : 08-05-05 19:17

Hej.

Er der nogen der ved hvordan man laver sin egen message loop i delphi?

Altså den løkke man har i windows programmer, der står og forarbejder
messages.

Jeg har set een løsning, men der skabes alle forms o.s.v. manuelt, og det
gider jeg ikke ud i. Jeg skal kun have lavet min egen message loop.

mvh.

Klaus.



 
 
Klaus Petersen (08-05-2005)
Kommentar
Fra : Klaus Petersen


Dato : 08-05-05 20:10

> Er der nogen der ved hvordan man laver sin egen message loop i delphi?
>
> Altså den løkke man har i windows programmer, der står og forarbejder
> messages.

Det er åbentbart meget sjældent, at man får brug for at lave sin egen
messagehandler (ShowModal funktionen på en form er et eksempel på et
tilfælde hvor det er nødvendigt).

I mit tilfælde har jeg brug for at udføre noget kode et vist antal gange i
sekundtet, men det skal udføres temmeligt præcist, så derfor er timeren ikke
tilstrækkelig.

Måden man normalt ville gøre dette uden at bruge timers er at skrive sin
egen message loop.

Mådne man gør det på i delphi, er ved at skrive en Application.OnIdle
eventhandler. Den har en Done parameter, som man kan sætte til false og få
samme effekt som med sin egen message loop.



Thor (09-05-2005)
Kommentar
Fra : Thor


Dato : 09-05-05 09:41


> I mit tilfælde har jeg brug for at udføre noget kode et vist antal gange i
> sekundtet, men det skal udføres temmeligt præcist, så derfor er timeren
> ikke
> tilstrækkelig.

Hej Klaus

Måske skulle du lave en separat thread istedet for?

mvh Thor




Christen Fihl (10-05-2005)
Kommentar
Fra : Christen Fihl


Dato : 10-05-05 10:05

Prøv at kikke på timer opsætning og hvordan denne gøres mere præsis (1 mSec
opløsning).

Uses MMSystem;

procedure TimerQuickTimer;
begin
timeBeginPeriod(lpTimeCaps.wPeriodMin); // 1mSec
end;

procedure TimerNormalTimer;
begin
timeEndPeriod(lpTimeCaps.wPeriodMin);
end;

var
lpTimeCaps: TTimeCaps;
begin
timeGetDevCaps(@lpTimeCaps, SizeOf(lpTimeCaps));
TimerQuickTimer;
repeat
Sleep(15); // Nu mere præsis
...
until ....
TimerNormalTimer;
end;

Og gør så dette i en separat thread, som Thor også skriver.

--
Christen Fihl
http://HSPascal.fihl.net



Nicolai Hansen (11-05-2005)
Kommentar
Fra : Nicolai Hansen


Dato : 11-05-05 12:24

"Klaus Petersen" <ng@spectual.ra.bnaa.dk> wrote in message news:<427e63f5$0$79455$14726298@news.sunsite.dk>...
> > Er der nogen der ved hvordan man laver sin egen message loop i delphi?
> >
> > Altså den løkke man har i windows programmer, der står og forarbejder
> > messages.

Det er ikke helt normalt at man har brug for dette i Delphi, men:

i TForm.OnCreate skriver du flg:

Application.MessageHandler:=MessageHandler;

og du definerer så proceduren

Procedure TForm.MessageHandler(var Msg: TMsg; var Handled: Boolean);
begin
// behandling af messages her
// f.eks. global aflæsning af ESC:

Handled:=false; // hvis handled er false blir beskeden sendt videre
til næste niveau. F.eks. en knaps OnClick().
case Msg.Message of
WM_KEYDOWN :
begin
Key:=;
if Key=1 then
begin
ShowMessage('ESC trykket!');
Handled:=true;
end;
end;
end;
end;

Klaus Petersen (12-05-2005)
Kommentar
Fra : Klaus Petersen


Dato : 12-05-05 22:26

> Er der nogen der ved hvordan man laver sin egen message loop i delphi?

> Det er ikke helt normalt at man har brug for dette i Delphi, men:
>
> i TForm.OnCreate skriver du flg:
>
> Application.MessageHandler:=MessageHandler;
> ....

Det er selve messagehandleren du har der.

Et typisk windows program skrevet i c/c++ vil starte med at registrere en
vindue-klasse, herefter skabe selve vinduet og så vil den gå i en løkke, som
kaldes for message loop eller message pump.

Løkken kunne se sådan her ud:

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}

Løkken er fin nok til de fleste formål - men ikke til spil, da den står og
venter i GetMessage kaldet på at den kommer en besked.




Nicolai Hansen (23-05-2005)
Kommentar
Fra : Nicolai Hansen


Dato : 23-05-05 08:31

"Klaus Petersen" <ng@spectual.ra.bnaa.dk> wrote in message news:<4283c9dc$0$79460$14726298@news.sunsite.dk>...
> > Er der nogen der ved hvordan man laver sin egen message loop i delphi?
>
> > Det er ikke helt normalt at man har brug for dette i Delphi, men:
> >
> > i TForm.OnCreate skriver du flg:
> >
> > Application.MessageHandler:=MessageHandler;
> > ....
>
> Det er selve messagehandleren du har der.
>
> Et typisk windows program skrevet i c/c++ vil starte med at registrere en
> vindue-klasse, herefter skabe selve vinduet og så vil den gå i en løkke, som
> kaldes for message loop eller message pump.
>
> Løkken kunne se sådan her ud:
>
> while (GetMessage (&msg, NULL, 0, 0))
> {
> TranslateMessage (&msg);
> DispatchMessage (&msg);
> }
>
> Løkken er fin nok til de fleste formål - men ikke til spil, da den står og
> venter i GetMessage kaldet på at den kommer en besked.

I så fald kan man bruge PeekMessage istedet

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

Månedens bedste
Årets bedste
Sidste års bedste