Sign in Join
Wiki copytemporary

Main Loop Hooks/sk: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Prehľad problému
22
33Potrebujete čakať kým nastane nejaká udalosť (v sokete alebo rúre ...), ale chcete to urobiť v základnom (GUI) vlákne a neblokovať GUI a tiež nechcete viacero vlákien? Riešenie tohoto problému je schopnosť pridať extra obsluhy, ktoré čakjú v hlavnej slučke udalostí.
44
55## Detaily riešenia
66
77Pre poskytnutie tejto schopnosti boli do jednotky [[doc:lcl/lclintf|LCLIntf]] pridané dve funkcie:
88
9-`AddEventHandler(AHandle: THandle; AFlags: dword; `\
10-`    AEventHandler: TWaitHandleEvent; AData: PtrInt): PEventHandler;`\
11-`RemoveEventHandler(var AHandler: PEventHandler);`\
12-`SetEventHandlerFlags(AHandler: PEventHandler; NewFlags: dword);`
9+``` pascal
10+AddEventHandler(AHandle: THandle; AFlags: dword;
11+ AEventHandler: TWaitHandleEvent; AData: PtrInt): PEventHandler;
12+RemoveEventHandler(var AHandler: PEventHandler);
13+SetEventHandlerFlags(AHandler: PEventHandler; NewFlags: dword);
14+```
1315
1416Typ [[doc:lcl/interfacebase/twaithandleevent.html|TWaitHandleEvent]] je deklarovaný v jednotke **InterfaceBase** ako:
1517
16-` TWaitHandleEvent = procedure(AData: PtrInt; AFlags: dword) of object;`
18+``` pascal
19+ TWaitHandleEvent = procedure(AData: PtrInt; AFlags: dword) of object;
20+```
1721
1822[[doc:lcl/lclintf/addeventhandler.html|AddEventHandler]] pridáva obsluhu čakajúcu v hlavnej slučke udalostí.
1923
2024Keď je signalizovaná obsluha, potom je volaná procedúra zadaná v ACallback s parametrom **AData**, ktorý je poslaný pri registrovaní obsluhy udalosti, a príznakmi, ktoré sú špecifické pre OS. Príznaky, poslané do **AddEventHandler**, môžu byť upravené pomocou **SetEventHandlerFlags**. Handler (ukazovateľ) vrátený **AddEventHandler** musí byť poslaný do **RemoveEventHandler** pre zastavenie očakávania priradenej obsluhe.
2125
2226[[doc:lcl/lclintf/removeeventhandler.html|RemoveEventHandler]] zastavuje očakávanie zadanej obluhy. **RemoveEventHandler** nastaví, pred ukončením, **AHandler** na nil. Jeho argumentom je ukazovateľ vrátený z **AddEventHandler**.
2327
2428### Windows
2529
2630V aktuálnej implementácii nie je parameter **AFlags** v **AddEventHandler** použitý a **AFlags** v **TWaitHandleEvent** bude 0.
2731
2832Win32 podporuje nasledujúce typy handle, v podstate veci podporované MsgWaitForMultipleObjects:
2933
3034- oznamovania zmeny (pre súbory a adresáre)
3135- konzolový vstup
3236- udalosti: signalizované WinAPI funkciou SetEvent
3337- mutexy: signalizované keď ich nikto nevlastní
3438- procesy: signalizované keď sú skončené
3539- semfóry: signalizované keď je ich počet väčší ako nula
3640- vlákna: signalizované keď sú skončené
3741- časovače: signalizované keď vyprší, viz SetWaitableTimer
3842
3943### Gtk/Unix
4044
4145Parameter **AFlags** v **AddEventHandler** udáva podmienky, za ktorých má byť signalizovaná obsluha, s možnýmy hodnotami dokuemntovanými v type GIOCondition v použití [glib](http://developer.gimp.org/api/2.0/glib/glib-IO-Channels.html#GIOCondition).
4246
4347V spätnom volaní bude **AFlags** obsahovať podmienky vyššie odkazovaného typu **GIOCondition**, ktoré boli splnené.
4448
4549Gtk/unix podporuje nasledujúce typy obsluhy:
4650
4751- súbory
4852- sokety
4953- rúry
5054
5155Všimnite si, že Win32 nepodporuje sokety a rúry (prinajmenšom ich použitie je "odradzované" v MSDN). Návrh: použite **WSAEventSelect** na vytvorenie udalosti spojenej so soketom a pošlite obsluhu udalosti.
5256
5357### Rúry a ukončovanie procesu
5458
5559Pre poskytnutie viac-platformného riešenia pre rúry (neveľmi podporované na Win32) a procesy (nie veľmi podporované na GTK/Unix) boli pridané ďalšie funkcie:
5660
57-`TChildExitReason = (cerExit, cerSignal);`\
58-`TPipeReason = (prDataAvailable, prBroken, prCanWrite);`\
59-`TPipeReasons = set of TPipeReason;`\
61+``` pascal
62+TChildExitReason = (cerExit, cerSignal);
63+TPipeReason = (prDataAvailable, prBroken, prCanWrite);
64+TPipeReasons = set of TPipeReason;
6065
61-`TChildExitEvent = procedure(AData: PtrInt; AReason: TChildExitReason; AInfo: dword) of object;`\
62-`TPipeEvent = procedure(AData: PtrInt; AReasons: TPipeReasons) of object;`
66+TChildExitEvent = procedure(AData: PtrInt; AReason: TChildExitReason; AInfo: dword) of object;
67+TPipeEvent = procedure(AData: PtrInt; AReasons: TPipeReasons) of object;
68+```
6369
64-`function  AddProcessEventHandler(AHandle: THandle; `\
65-`    AEventHandler: TChildExitEvent; AData: PtrInt): PProcessEventHandler;`\
66-`procedure RemoveProcessEventHandler(var AHandler: PProcessEventHandler);`\
70+``` pascal
71+function AddProcessEventHandler(AHandle: THandle;
72+ AEventHandler: TChildExitEvent; AData: PtrInt): PProcessEventHandler;
73+procedure RemoveProcessEventHandler(var AHandler: PProcessEventHandler);
6774
68-`function  AddPipeEventHandler(AHandle: THandle; `\
69-`    AEventHandler: TPipeEvent; AData: PtrInt): PPipeEventHandler;`\
70-`procedure RemovePipeEventHandler(var AHandler: PPipeEventHandler);`
75+function AddPipeEventHandler(AHandle: THandle;
76+ AEventHandler: TPipeEvent; AData: PtrInt): PPipeEventHandler;
77+procedure RemovePipeEventHandler(var AHandler: PPipeEventHandler);
78+```
7179
7280Keď proces končí, bude volaná zadaná obsluha udalosti. **AInfo** bude obsahovať ukončovací kód, ak **AReason** je cerExit, alebo (len Unix) ukončovací signál, ak **AReason** je cerSignal. Pre GTK/Unix, použite PID ako **AHandle** pre sledovanie. Interne, je nainštalovaný popisovač signálu pre pochopenie signálu SIGCHLD. Na Win32, je na čakanie ukončenia procesu použitý **AddEventHandler**.
7381
7482Pre sledovanie rúry na prichádzajúce dáta, pošlite do **AddPipeEventHandler** popisovač súboru (unix) alebo handle konca čítania rúry, so zvolenou metódou obsluhy udalosti ako **AEventHandler**. Na GTK/Unix, je volaná **AddEventHandler** na čakanie prevádzky popisovača súboru. Na Win32, slučka správ vyprší každých 100 ms, na kontrolu všetkých čakaných rúr na dostupná dáta, ak sú dostupné dáta, je volaná obsluha udalosti.
7583
7684---
7785*From the Free Pascal wiki, page "Main Loop Hooks/sk", as it stood on 2008-01-02 after a change by Slavko, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history