/ 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
Messages i Delphi
Fra : Thomas Holmgren


Dato : 15-03-04 11:55

Hej!

"Tre hurtige" omkring messagehandling i Delphi! :)

Har jeg forstået følgende korrekt:

Messagehandling foregår altid asynkront. Altså ved dispatch bliver
messages (altid) sendt omgående, men bliver først processeret af
modtagerprocessen når denne har tid/lyst. Hvad med styring af
bufferplads hos modtageren? Er der en grænse for hvor mange messages der
kan ligge i kø, eller begrænses det kun af tilgængelig arbejdshukommelse?

Jeg kan definere mine egne messages som jeg har lyst til. Jeg er ikke
tvunget til at anvende TMessage, men kan lave lige præcist de messages
jeg har lyst til, som indeholder netop de datafelter jeg har brug for.
Der findes et hav af prædefinerede messages, hvor finder jeg en komplet
liste?

Jeg bruger konstanten WM_APP som udgangspunkt når jeg "finder på" et
message ID. Skal jeg selv bare gribe et tal udfra den blå luft? Hvordan
undgår jeg at mine egne, personlige messages kolliderer med eksisterende
messages? Findes der en liste over hvilke message ID'er der anvendes af
Delphis standardkomponenter?

Igen: Tusind tak for hjælpen! :)


--
Mvh.
Thomas Holmgren

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


Dato : 15-03-04 16:52

"Thomas Holmgren" <thm@regnecentralen.dk> wrote in message
news:c3422o$2h7o$1@news.cybercity.dk...
> Hej!
>
> "Tre hurtige" omkring messagehandling i Delphi! :)
>
> Har jeg forstået følgende korrekt:
>
> Messagehandling foregår altid asynkront. Altså ved dispatch bliver
> messages (altid) sendt omgående, men bliver først processeret af
> modtagerprocessen når denne har tid/lyst.

Ja.

> Hvad med styring af
> bufferplads hos modtageren? Er der en grænse for hvor mange messages der
> kan ligge i kø, eller begrænses det kun af tilgængelig arbejdshukommelse?

Aner det ikke - har aldrig nogen sinde hørt nogle som skulle have nået én
eller anden limit, eller det skulle være noget man burde være opmærksom på.
Jeg ville dog umiddelbart tro, at windows vanen tro principielt har én eller
anden fastdefineret max-størrelse på køen.

> Jeg kan definere mine egne messages som jeg har lyst til. Jeg er ikke
> tvunget til at anvende TMessage, men kan lave lige præcist de messages
> jeg har lyst til, som indeholder netop de datafelter jeg har brug for.
> Der findes et hav af prædefinerede messages, hvor finder jeg en komplet
> liste?

messages.pas

> Jeg bruger konstanten WM_APP som udgangspunkt når jeg "finder på" et
> message ID. Skal jeg selv bare gribe et tal udfra den blå luft?

Ja - det *kan* man faktisk godt, men du kan også få én med
RegisterWindowMessage.

>Hvordan
> undgår jeg at mine egne, personlige messages kolliderer med eksisterende
> messages? Findes der en liste over hvilke message ID'er der anvendes af
> Delphis standardkomponenter?

Windows har defineret en WM_USER man kan starte fra - f.eks WM_HOLMGREN =
WM_USER+27; WM_APP kan bruges hvis man f.eks skal lave en tilføjelse til
systemmenuen.



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


Dato : 16-03-04 09:08

> > Hvad med styring af
> > bufferplads hos modtageren? Er der en grænse for hvor mange messages der
> > kan ligge i kø, eller begrænses det kun af tilgængelig arbejdshukommelse?
>
> Aner det ikke - har aldrig nogen sinde hørt nogle som skulle have nået én
> eller anden limit, eller det skulle være noget man burde være opmærksom på.
> Jeg ville dog umiddelbart tro, at windows vanen tro principielt har én eller
> anden fastdefineret max-størrelse på køen.

Jeg ville nu mene at vanen tro ville der være mulighed for et buffer
overflow når vi snakker windows ;)
Jeg har heller ikke hørt om at der skulle være et maximum, men jeg vil
foreslå at du prøver at spørge i C nyhedsgruppen istedet, da det
(desværre) er ret sjældent at Delphi folk roder med message handlers.

> > Jeg kan definere mine egne messages som jeg har lyst til. Jeg er ikke
> > tvunget til at anvende TMessage, men kan lave lige præcist de messages
> > jeg har lyst til, som indeholder netop de datafelter jeg har brug for.
> > Der findes et hav af prædefinerede messages, hvor finder jeg en komplet
> > liste?
>
> messages.pas

Som også indeholder en del af de message records du arbejder med.
Bemærk "packed" keywordet.

> > Jeg bruger konstanten WM_APP som udgangspunkt når jeg "finder på" et
> > message ID. Skal jeg selv bare gribe et tal udfra den blå luft?
>
> >Hvordan
> > undgår jeg at mine egne, personlige messages kolliderer med eksisterende
> > messages? Findes der en liste over hvilke message ID'er der anvendes af
> > Delphis standardkomponenter?
>
> Windows har defineret en WM_USER man kan starte fra - f.eks WM_HOLMGREN =
> WM_USER+27; WM_APP kan bruges hvis man f.eks skal lave en tilføjelse til
> systemmenuen.

Bemærk at WM_USER+1 ($0401) er netværks besked... Logisk :)

Thomas Holmgren (16-03-2004)
Kommentar
Fra : Thomas Holmgren


Dato : 16-03-04 09:54

Hej


David Konrad wrote:

[msg. dispatch er asynkron og non-blokerende?]

> Ja.

Herligt, det gør jo visse ting meget nemmere. :) En ting undrer mig..
Jeg har (som et lille forsøg) lavet et program med et par tråde der
sender messages til hinanden. Hvis jeg blokerer en af mine tråde (enten
ved at suspende den eller med en sleep(n)) så bliver messages sendt til
den pågældende tråd ALLIGEVEL processeret omgående!? Hvor finder tråden
"energi" til det? Hvis den er igang med at sleepe burde den da ikke have
overskud til at reagere på mine udefrakommende messages?

> Windows har defineret en WM_USER man kan starte fra - f.eks WM_HOLMGREN =
> WM_USER+27; WM_APP kan bruges hvis man f.eks skal lave en tilføjelse til
> systemmenuen.

Glimrende, tak for det :) En anden ting, vedr. mine message-records: Så
vidt jeg har forstået på de (halvdårlige) eksempler jeg har fundet på
nettet, så kan jeg lave mine message-records præcist som jeg har lyst
til, sålænge bare første felt i recorden hedder Msg og er af typen word?

Endnu engang, tak for hjælpen! :)


--
Mvh.
Thomas Holmgren

Christian Iversen (16-03-2004)
Kommentar
Fra : Christian Iversen


Dato : 16-03-04 10:25

Thomas Holmgren wrote:

> Glimrende, tak for det :) En anden ting, vedr. mine message-records: Så
> vidt jeg har forstået på de (halvdårlige) eksempler jeg har fundet på
> nettet, så kan jeg lave mine message-records præcist som jeg har lyst
> til, sålænge bare første felt i recorden hedder Msg og er af typen word?

Nej, de skal være samme størrelse.

--
M.V.H
Christian Iversen

Thomas Holmgren (16-03-2004)
Kommentar
Fra : Thomas Holmgren


Dato : 16-03-04 11:09

Hej Christian
Christian Iversen wrote:

[messages, def. af]

> Nej, de skal være samme størrelse.

Hm, så har jeg vist bare været heldig med det eksempel jeg lige bankede
sammen :) Jeg lavede en message med en Msg : cardinal som 1. element, og
så ellers en streng. Det fungerede tilsyneladende glimrende. Sådan kan
det gå :)

Hvis vi tager et tilfældigt eksempel fra messages.pas:

TWMSysDeadChar = packed record
Msg: Cardinal;
CharCode: Word;
Unused: Word;
KeyData: Longint;
Result: Longint;
end;

så kan jeg altså godt gå ud fra at det er sådan messages skal se ud, og
dermed har en maksimal størrelse på 4 + 2 + 2 + 4 + 4 = 16 bytes?
Bestemmer jeg selv hvordan de 16 bytes "bruges" hvis bare jeg reserverer
de første 4 til Msg.? Kan man ikke sammen med en message overføre en
større datamængde? Hvad gør man konkret hvis man gerne vil "overføre"
f.eks. en streng eller en record (eller objekt for den sags skyld)?
Lader man modtageren af messagen kalde afsenderen og bede om data? ..Det
giver da lidt bøvl når nu messagehandling er asynkron. :)


--
Mvh.
Thomas Holmgren

Harald (16-03-2004)
Kommentar
Fra : Harald


Dato : 16-03-04 11:15

"Thomas Holmgren" <thm@regnecentralen.dk> skrev i en meddelelse
news:c36jn3$1qm4$1@news.cybercity.dk...
> Hej Christian
> Christian Iversen wrote:
>
> [messages, def. af]
>
> > Nej, de skal være samme størrelse.
>
> Hm, så har jeg vist bare været heldig med det eksempel jeg lige bankede
> sammen :) Jeg lavede en message med en Msg : cardinal som 1. element, og
> så ellers en streng. Det fungerede tilsyneladende glimrende. Sådan kan
> det gå :)
>
> Hvis vi tager et tilfældigt eksempel fra messages.pas:
>
> TWMSysDeadChar = packed record
> Msg: Cardinal;
> CharCode: Word;
> Unused: Word;
> KeyData: Longint;
> Result: Longint;
> end;
>
> så kan jeg altså godt gå ud fra at det er sådan messages skal se ud, og
> dermed har en maksimal størrelse på 4 + 2 + 2 + 4 + 4 = 16 bytes?
> Bestemmer jeg selv hvordan de 16 bytes "bruges" hvis bare jeg reserverer
> de første 4 til Msg.? Kan man ikke sammen med en message overføre en
> større datamængde? Hvad gør man konkret hvis man gerne vil "overføre"
> f.eks. en streng eller en record (eller objekt for den sags skyld)?
> Lader man modtageren af messagen kalde afsenderen og bede om data? ..Det
> giver da lidt bøvl når nu messagehandling er asynkron. :)

Prøv at kikke på WM_COPYDATA

/HK



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


Dato : 16-03-04 17:05

"Thomas Holmgren" <thm@regnecentralen.dk> wrote in message
news:c36jn3$1qm4$1@news.cybercity.dk...

> så kan jeg altså godt gå ud fra at det er sådan messages skal se ud, og
> dermed har en maksimal størrelse på 4 + 2 + 2 + 4 + 4 = 16 bytes?

Ja.

> Bestemmer jeg selv hvordan de 16 bytes "bruges" hvis bare jeg reserverer
> de første 4 til Msg.? Kan man ikke sammen med en message overføre en
> større datamængde? Hvad gør man konkret hvis man gerne vil "overføre"
> f.eks. en streng eller en record (eller objekt for den sags skyld)?

Det samme.

> Lader man modtageren af messagen kalde afsenderen og bede om data? ..Det
> giver da lidt bøvl når nu messagehandling er asynkron. :)

Hvis du overfører et objekt er det jo kun referencen. Strenge kan du også
overføre, men kun internt - skal de tolkes af udefrakommende programmer må
du bruge pchar.



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


Dato : 16-03-04 20:21

> Hvis vi tager et tilfældigt eksempel fra messages.pas:
>
> TWMSysDeadChar = packed record
> Msg: Cardinal;
> CharCode: Word;
> Unused: Word;
> KeyData: Longint;
> Result: Longint;
> end;
>
> så kan jeg altså godt gå ud fra at det er sådan messages skal se ud, og
> dermed har en maksimal størrelse på 4 + 2 + 2 + 4 + 4 = 16 bytes?
> Bestemmer jeg selv hvordan de 16 bytes "bruges" hvis bare jeg reserverer
> de første 4 til Msg.?

{ Message structure }
PMsg = ^TMsg;
tagMSG = packed record
hwnd: HWND;
message: UINT;
wParam: WPARAM;
lParam: LPARAM;
time: DWORD;
pt: TPoint;
end;
{$EXTERNALSYM tagMSG}
TMsg = tagMSG;
MSG = tagMSG;
{$EXTERNALSYM MSG}

Dette er snippet fra windows.pas og er den struktur du kan læse i din
message handler. Lad os sammenligne:

hwnd: HWND;

Denne her ligger inden din record, og er dekodet inden du får data i
hånden.

> Msg: Cardinal;
message: UINT;

Beskedens nummer. Fire bytes.

> CharCode: Word;
> Unused: Word;
wParam: WPARAM;

CharCode tilgås som Msg.wParam div 65536 - Unused tilgås (ikke) som
Msg.wParam mod 65536. Endnu fire bytes

> KeyData: Longint;
lParam: LPARAM;

KeyData=lParam. Fire bytes flere.

> Result: Longint;
time: DWORD;

Tjae. De fire sidste bytes...

pt: TPoint;

Den her er ikke med i din record heller - jeg ved det ikke med
sikkerhed, men går ud fra at også den bliver dekodet af Windows inden
du ser beskeden.
Måske der er andre herinde som ved netop dette?

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


Dato : 16-03-04 17:02

"Thomas Holmgren" <thm@regnecentralen.dk> wrote in message
news:c36fb1$1mmt$1@news.cybercity.dk...

> Herligt, det gør jo visse ting meget nemmere. :) En ting undrer mig..
> Jeg har (som et lille forsøg) lavet et program med et par tråde der
> sender messages til hinanden. Hvis jeg blokerer en af mine tråde (enten
> ved at suspende den eller med en sleep(n)) så bliver messages sendt til
> den pågældende tråd ALLIGEVEL processeret omgående!? Hvor finder tråden
> "energi" til det? Hvis den er igang med at sleepe burde den da ikke have
> overskud til at reagere på mine udefrakommende messages?

Altså :

Suspended = trådens Execute ligger i dvale
Sleep = der ventes blot (i Execute) i x antal millisekunder

Dette berører jo ikke i sig selv den underliggende DefaultHandler-metode -
det er to vidt forskellige ting.

> > Windows har defineret en WM_USER man kan starte fra - f.eks WM_HOLMGREN
=
> > WM_USER+27; WM_APP kan bruges hvis man f.eks skal lave en tilføjelse til
> > systemmenuen.
>
> Glimrende, tak for det :) En anden ting, vedr. mine message-records: Så
> vidt jeg har forstået på de (halvdårlige) eksempler jeg har fundet på
> nettet, så kan jeg lave mine message-records præcist som jeg har lyst
> til, sålænge bare første felt i recorden hedder Msg og er af typen word?

Jeg har ikke undersøgt det, men så vidt jeg husker fandt jeg for nogle år
siden frem til, at det er komplet ligegyldigt - men hæng mig ikke op på
det - bruger som sagt ikke Delphi længere.



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

Månedens bedste
Årets bedste
Sidste års bedste