Sign in Join
Wiki copytemporary

Main Loop Hooks/fr: what changed

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

OldNewLine
11## Enoncé du problème
22
33Vous devez attendre un événement (sur le socket[1](http://www.dicofr.com/cgi-bin/n.pl/dicofr/definition/20010101004807) ou pipe ou ...) qui arrive, mais vous voulez faire cela dans le processus principal (GUI) et vous ne voulez pas bloquer le GUI et aussi vous ne voulez pas faire du multi-threading. La solution à ce problème est la possibilité d'ajouter des "handles" [2](http://www.dicofr.com/cgi-bin/n.pl/dicofr/definition/20010101002342) supplémentaires pour être observés dans la boucle d'événement principale.
44
55## Les détails de la Solution
66
77Dans l'unité [[doc:lcl/lclintf|LCLIntf]] deux fonctions ont été ajoutées pour tenir compte de cette fonctionnalité, ce sont :
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
1416Le [[doc:lcl/interfacebase/twaithandleevent.html|TWaitHandleEvent]] est déclaré dans l'unité InterfaceBase comme :
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]] ajoute un handle pour être observé dans la boucle d'évênement principale. Quand le handle est "signalé ", alors la procédure indiqué dans ACallback sera appellé avec comme paramètre AData qui était passé lors de l'enregistrement du traiteur d'évênement, et tous drapeaux , qui dont spécifiques au système d'exploitation. Le drapeau passés à AddEventHandler peut être modifié en utilisants le SetEventHandlerFlags. Le handler retourné (un pointeur) par AddEventHandler devrait être passé à RemoveEventHandler pour cesser d'observer l'handle associée .
1923
2024[[doc:lcl/lclintf/removeeventhandler.html|RemoveEventHandler]] arrête d'observer l'handle spécifié. RemoveEventHandler fixera AHandler à nil avant le renvoi . Son argument est un pointeur retourné par AddEventHandler.
2125
2226### Windows
2327
2428Le paramètre AFlags dans AddEventHandler n'est pas utilisé, et le AFlags dans TWaitHandleEvent a pour valeur dans l'implémentation actuelle.
2529
2630Win32 supportes les types de handeles suivants, basiquement les choses supportées par MsgWaitForMultipleObjects:
2731
2832- notifications de changement (pour les fichiers et dossiers)
2933- entrées de console (console input)
3034- events: signalés avec la fonction winapi SetEvent
3135- mutexes: signalés quand il n 'est plus possédé par quoi que ce soit
3236- processes: signalés quand ils sont terminés
3337- semaphore: signalés quand son *count* est supérieur à 0
3438- threads: signalés quand ils sont terminés
3539- timers: signalés quand ils expirent, voir SetWaitableTimer
3640
3741### Gtk/Unix
3842
3943Le paramètre AFlags de AddEventHandler spécifie la condition dans laquelle le handle devrait être signalé, avec pour valeurs possibles celles documentées dans le type GIOCondition dans la référence [glib](http://developer.gimp.org/api/2.0/glib/glib-IO-Channels.html#GIOCondition).
4044
4145Dans le callback, AFlags contiendra la condition, comme référencée dans le type GIOCondition vu ci-dessus, qui doit être satistfaite.
4246
4347Gtk/unix supporte les types de handles suivants:
4448
4549- fichiers
4650- sockets
4751- pipes
4852
4953Notez que win32 ne supporte pas les sockets ou les pipes (du moins, leur usage est "découragé" par MSDN). Suggestion: utiliser WSAEventSelect pour créer un évenement associé à une socket et passer le handle d'évenement.
5054
5155### Pipes et Terminaison de Processus
5256
5357Pour offrir une solution cross-platform pour les pipes (mal supportés sous win32) et les processus (mal supportés sous gtk/unix) des fonctions additionnelles ont été ajoutées:
5458
55-`TChildExitReason = (cerExit, cerSignal);`\
56-`TPipeReason = (prDataAvailable, prBroken, prCanWrite);`\
57-`TPipeReasons = set of TPipeReason;`\
59+``` pascal
60+TChildExitReason = (cerExit, cerSignal);
61+TPipeReason = (prDataAvailable, prBroken, prCanWrite);
62+TPipeReasons = set of TPipeReason;
5863
59-`TChildExitEvent = procedure(AData: PtrInt; AReason: TChildExitReason; AInfo: dword) of object;`\
60-`TPipeEvent = procedure(AData: PtrInt; AReasons: TPipeReasons) of object;`
64+TChildExitEvent = procedure(AData: PtrInt; AReason: TChildExitReason; AInfo: dword) of object;
65+TPipeEvent = procedure(AData: PtrInt; AReasons: TPipeReasons) of object;
66+```
6167
62-`function  AddProcessEventHandler(AHandle: THandle; `\
63-`    AEventHandler: TChildExitEvent; AData: PtrInt): PProcessEventHandler;`\
64-`procedure RemoveProcessEventHandler(var AHandler: PProcessEventHandler);`\
68+``` pascal
69+function AddProcessEventHandler(AHandle: THandle;
70+ AEventHandler: TChildExitEvent; AData: PtrInt): PProcessEventHandler;
71+procedure RemoveProcessEventHandler(var AHandler: PProcessEventHandler);
6572
66-`function  AddPipeEventHandler(AHandle: THandle; `\
67-`    AEventHandler: TPipeEvent; AData: PtrInt): PPipeEventHandler;`\
68-`procedure RemovePipeEventHandler(var AHandler: PPipeEventHandler);`
73+function AddPipeEventHandler(AHandle: THandle;
74+ AEventHandler: TPipeEvent; AData: PtrInt): PPipeEventHandler;
75+procedure RemovePipeEventHandler(var AHandler: PPipeEventHandler);
76+```
6977
7078Quand un processus se termine le handler d'événement spécifié sera appelé. AInfo contiendra le code de sortie si AReason est cerExit, ou (sous unix seulement) le signal de terminaison si AReason est cerSignal. Pour gtk/unix, utilisez le PID pour surveiller en tant que AHandle. En interne, un handler de signal est installé pour surveiller le signal SIGCHLD. Sous win32, AddEventHandler est utilisé pour surveiller la terminaison de processus.
7179
7280Pour surveiller les données entrantes d'un pipe, passez le descripteur de fichier (unix) ou le handle de la partie lecture du pipe à AddPipeEventHandler avec une méthode de handler d'événement personnalisé choisi en tant que AEventHandler. Sous gtk/unix, AddEventHandler est appelé pour surveiller le traffic sur le descripteur de fichier. Sous win32, la boucle de message fait un timeout toutes les 100 msecs pour vérifier s'il y a des données disponibles sur tous les pipes surveillés; si des données sont disponibles, le handler d'événement est appelé.
7381
7482---
7583*From the Free Pascal wiki, page "Main Loop Hooks/fr", as it stood on 2008-06-19 after a change by LazarusBob, 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