Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Slanje strukture putem PostMessage

[es] :: Pascal / Delphi / Kylix :: Slanje strukture putem PostMessage

[ Pregleda: 2515 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

borovac
127.0.0.1

Član broj: 29278
Poruke: 220
*.dlp497.bih.net.ba.



Profil

icon Slanje strukture putem PostMessage12.06.2005. u 10:07 - pre 228 meseci
Kako poslati record putem PostMessage ili SendMessage??
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Slanje strukture putem PostMessage12.06.2005. u 10:22 - pre 228 meseci
Gde zelis da posaljes record ? Drugom procesu ?
Preko Post/SendMessage se ne moze poslati record bas lako... Imas boljih nacina da odradis IPC, najlakse bi ti bilo preko pipe-ova. Ako hoces primer, reci pa da postam.
 
Odgovor na temu

morlic
Milos Orlic
Beograd

Član broj: 6081
Poruke: 735
*.26.EUnet.yu.



+1 Profil

icon Re: Slanje strukture putem PostMessage12.06.2005. u 10:47 - pre 228 meseci
Ukratko, ukoliko zelis da posaljes nesto u drugi proces nece moci, jer su poiinteri validni samo u okviru jednog procesa. Znaci nesto mozes eventualno da saljes u okviru istog procesa, npr. drugom prozoru ili slicno, ali i tada imas problem. PostMessage radi asinhrono sto znaci kada posaljes poruku nisi siguran kada ce stici tamo gde treba, evo primera:

Code:

Const
  WM_SOME_DATA = WM_USER + $FF;
Var
  i: integer;
...
begin
  i:=10;
  PostMessage(WndHandle, WM_SOME_DATA, i, 0);  
  // kod u ovom delu ce se mozda izvrsiti pre nego sto poruka stigne na
  // zeljeno mesto
end;


Mozes da koristis SendMessage(), i da prosledjujes kao parametar pointer na record:

Code:

type
   TInfo = record
      Vreme: TDateTime;
      Attrib: integer;
   end;
   PInfo = ^TInfo;
...
Var
  Info: PInfo; // Neki globalni var
...
begin
  New(Info);
  Info.Vreme:= Now;
  Attrib:= 1; 
  SendMessage(WndHandle, WM_SOME_DATA, Integer(Info), 0);
end;


pa kod koji dobija poruku radi sledece:

Code:

procedure TForm1.GetInfo(Var msg: TMessage );
 Var
   Info: TInfo;   
Begin
   Info:= PInfo(msg.wparam)^; // Pravimo svoju kopiju podataka
   Dispose(PInfo(msg.wparam)); // Oslobadjamo memoriju
   ... Nastavljamo da radimo sa Info promenjivom u kojoj se nalazi
       kopija podataka


Ovo radi samo unutar iste aplikacije i moze dovesti do problema ako se iz nekog razloga ne izvrsi GetInfo, jer ce memorija zauzeta za record ostati zauzeta, i tako ce doci do curenja memorije. Plus ako jos radis sa nekim stringovima moze doci do problema jer kod koji kompajler generise za rukovanje stringovima ne moze da izadje na kraj sa svim varijantama koje programer moze da smisli, pa mozes imati fantomske probleme. Mogu da ti napravim primer za razmenu string podatka, ali mislim da tako ne treba resavati problem. Znaci moj savet je da PostMessage ili SendMessage koristis eventualno za razmenu prostih podataka do velicine 8 bajtova, jer imas dva parametra po 4 bajta na raspolaganju.

Ako zelis da razmenjujes vece podatke izmedju razlicith procesa/aplikacija mozes koristiti "memory mapped files". U folderu {$Delphi}\Demos\IPCDemos" imas demo za tako nesto, a u fajlu "IPCThrd.pas" u tom folderu se nalazi i manja klasa koja sluzi da pomogne u tim stvarima.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Slanje strukture putem PostMessage

[ Pregleda: 2515 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.