Sign in Join
Wiki copytemporary

Main Loop Hooks/sk: what changed

Revision 1 to 2. 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
99`AddEventHandler(AHandle: THandle; AFlags: dword; `\
1010`    AEventHandler: TWaitHandleEvent; AData: PtrInt): PEventHandler;`\
1111`RemoveEventHandler(var AHandler: PEventHandler);`\
1212`SetEventHandlerFlags(AHandler: PEventHandler; NewFlags: dword);`
1313
1414Typ [[doc:lcl/interfacebase/twaithandleevent.html|TWaitHandleEvent]] je deklarovaný v jednotke **InterfaceBase** ako:
1515
1616` TWaitHandleEvent = procedure(AData: PtrInt; AFlags: dword) of object;`
1717
1818[[doc:lcl/lclintf/addeventhandler.html|AddEventHandler]] pridáva obsluhu čakajúcu v hlavnej slučke udalostí.
1919
2020Keď 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.
2121
2222[[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**.
2323
2424### Windows
2525
2626V aktuálnej implementácii nie je parameter **AFlags** v **AddEventHandler** použitý a **AFlags** v **TWaitHandleEvent** bude 0.
2727
2828Win32 podporuje nasledujúce typy handle, v podstate veci podporované MsgWaitForMultipleObjects:
2929
3030- oznamovania zmeny (pre súbory a adresáre)
3131- konzolový vstup
3232- udalosti: signalizované WinAPI funkciou SetEvent
3333- mutexy: signalizované keď ich nikto nevlastní
3434- procesy: signalizované keď sú skončené
3535- semfóry: signalizované keď je ich počet väčší ako nula
3636- vlákna: signalizované keď sú skončené
3737- časovače: signalizované keď vyprší, viz SetWaitableTimer
3838
3939### Gtk/Unix
4040
4141Parameter **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).
4242
4343V spätnom volaní bude **AFlags** obsahovať podmienky vyššie odkazovaného typu **GIOCondition**, ktoré boli splnené.
4444
4545Gtk/unix podporuje nasledujúce typy obsluhy:
4646
4747- súbory
4848- sokety
4949- rúry
5050
5151Vš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.
5252
5353### Rúry a ukončovanie procesu
5454
5555Pre 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:
5656
5757`TChildExitReason = (cerExit, cerSignal);`\
5858`TPipeReason = (prDataAvailable, prBroken, prCanWrite);`\
5959`TPipeReasons = set of TPipeReason;`\
60-\
60+
6161`TChildExitEvent = procedure(AData: PtrInt; AReason: TChildExitReason; AInfo: dword) of object;`\
6262`TPipeEvent = procedure(AData: PtrInt; AReasons: TPipeReasons) of object;`
6363
6464`function  AddProcessEventHandler(AHandle: THandle; `\
6565`    AEventHandler: TChildExitEvent; AData: PtrInt): PProcessEventHandler;`\
6666`procedure RemoveProcessEventHandler(var AHandler: PProcessEventHandler);`\
67-\
67+
6868`function  AddPipeEventHandler(AHandle: THandle; `\
6969`    AEventHandler: TPipeEvent; AData: PtrInt): PPipeEventHandler;`\
7070`procedure RemovePipeEventHandler(var AHandler: PPipeEventHandler);`
7171
7272Keď 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**.
7373
7474Pre 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.
7575
7676---
7777*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