Umíme to s Delphi: 66. díl – Delphi a zprávy systému Windows, uživatelské zprávy

Diskuze čtenářů k článku

Jerry III  |  16. 12. 2002 00:56  | 

Zive ma tezky problemy zobrazovat cely clanky. U tohohle chybi ten priklad jak pouzit zpravy na synchronizaci mezi thready. Hrozne me to zajimalo, protoze melo jit o nejtypictejsi pouziti zprav ve Win - ja blbec dodneska synchronizuju thready pres synchronizacni objekty a ne pres zpravy. Strasne rad bych se dozvedel proc je smycka PeekMessage, GetMessage lepsi nez wait funkce.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petr  |  16. 12. 2002 01:36  | 

Zalezi na tom o jakou jde synchronizaci. V zasade v Delphi (VCL) se obvykle synchronizuje kod z jineho threadu s hlavnim threadem procesu ktery obhospodaruje GUI. Protoze GUI se ridi zpravami je nejsnazsi provest v tomto pripade synchronizaci pres zaslani zpravy do okna ktere vlastni hlavni thread, synchronizace se tak provede pres zpracovani zpravy. Koneckoncu tenhle princip se pouziva i jinde. Neznamena to ale jediny zpusob. Synchronizacni objekty jadra maji jine vyhody a hlavne se uplatni v necem trochu jinem. K tomu poznamka: implementace TThread.Synchronize v Delphi 6 a 7 uz zpravy take nepouziva, aby bylo mozne to pouzit i v aplikacich kde standardne neni message loop.

Samozrejme veta "Ukážeme si také příklad aplikace, která používá vlastní zprávy k synchronizaci vícevláknového běhu, což je jedním z nejtypičtějších použití zpráv vůbec" je nesmyslna.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Jerry III  |  16. 12. 2002 11:56  | 

Petre, to co popisujes ale neni synchronizace, to je jen jednostranne predavani stavu nebo dat z jednoho threadu do druheho. Synchronizace je uplne neco jineho. Posilani zprav se da pouzit na updatovani progresu ze samostatneho worker threadu do okna aplikace (jak si popsal), ale ne na synchronizaci threadu mezi sebou...

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petr  |  16. 12. 2002 16:55  | 

Jenze ten thread ma message loop, takze tim dochazi k synchronizaci s kodem ktery se vola jako reakce na zpravy.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Jerry III  |  17. 12. 2002 01:56  | 

Ale to vubec neni pravda, protoze message loop zpravy nezpracovava ihne djak prijdou a na vic je jeste nemusi nutne zpracovavat ve stejnym poradi v jakym prijdou. To proste neni synchronizace, to je obycejna status notification (a jeste ke vsemu muze byt dost nepresna).

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petr  |  17. 12. 2002 02:22  | 

Samozrejme ze to je pravda, viz treba:

Hned prvni otazka

Input-synchronized calls

Souhlasím  |  Nesouhlasím  |  Odpovědět
Jerry III  |  17. 12. 2002 17:45  | 

Tak si to ale precti - v obou tech clancich se pise pouze to, ze jeden thread nebude zpracovavat dve zpravy najednou. Ale to neni synchronizace. Synchronizace je treba kdyz jeden thread zjistuje text okna (ktery ma WindowProc na jinyh threadu) tak posila dve zpravy - WM_GETTEXTLEN a WM_GETTEXT. A synchronizaci potrebuje zjistit, aby mu mezi tema dvema zpravam nikdo ten text nezmenil. Nebo kdyz jeden thread prochazi linkovanej seznam tak by bylo zahodno aby ho jinej nemenil. A to zadnejma messagema neudelas, tohle se musi delat pres synchronizacni objekty (jako treba critical section nebo semaphory). Mozna si zkus prvne nekdy napsat aplikaci co ma vic nez jeden thread abys vedel co vlastne synchronizace je.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Jiri Cincura  |  17. 12. 2002 15:48  | 

A nvi tu nekdo, jak odhytavat vsechny zpravy, i ty co nedjou pro moji app. Chtel bych chytat vsechny zpravy klvesnice. Jde to? Umite to nekdo?

Souhlasím  |  Nesouhlasím  |  Odpovědět
mk  |  18. 12. 2002 10:23  | 

Já potřebuji něco trošku jiného. Potřebuji pomocí mého programu zmáčknout tlačítko jiné aplikace (nějaké cizí). Jak na to?

Souhlasím  |  Nesouhlasím  |  Odpovědět
Jiri Cincura  |  19. 12. 2002 10:11  | 

Jsou dve moznosti. Zjistit, kde to tlacitko je, a presunout nad nej mys a umele udelat klik. Je to takove krkolomne.

Pak jde udelt jeste jedna vec. Vezmes si hnadle toho okna teda toho tlacitka a na nej posles klik. Normalne jako zpravu.

 

JC

Souhlasím  |  Nesouhlasím  |  Odpovědět
Rafael  |  31. 12. 2002 13:28  | 

Čím může být, že zprávu odeslanou PostMessage nebo SendMessage s parametrem HWND_BROADCAST nezachytí žádná obsluha (ani přímo v odesílající aplikaci a okně)?  (Win98, Delphi7)
Nemám s tímhle žádnou velkou zkušenost. Nedělám nějakou chybu?

const
  am_MyEvent = wm_user+15;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure MyEventMessage(var Msg: TMessage); message am_MyEvent;
  end;

implementation

procedure TForm1.Button1Click(Sender: TObject);
begin
  PostMessage(HWND_BROADCAST, am_MyEvent, 11, 22);
end;

procedure TForm1.MyEventMessage(var Msg: TMessage);
begin
  Beep;  //a nezapípá a nezapípá...
end;

Samozřejmě, že bych v tomhle případě mohl použít Perform, ale konečným cílem je rozesílat zprávu všem oknů (vlastní) aplikace.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Zasílat názory e-mailem: Zasílat názory Můj názor

Aktuální číslo časopisu Computer

Test 9 bezdrátových reproduktorů

Jak ovládnout Instagram

Test levných 27" herních monitorů

Jak se zbavit nepotřebných věcí na internetu