|
| 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
| |
|
|