Threads et events

Résolu
Danonne Messages postés 2 Date d'inscription vendredi 24 novembre 2006 Statut Membre Dernière intervention 29 novembre 2006 - 24 nov. 2006 à 15:30
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 - 30 nov. 2006 à 17:06
Salut a tous.

Après de nombreuses recherches sur divers sites et forums, je n'ai pas réussi à trouver une réponse (claire et précise) à ma question existentielle... events ou messages?

Dans un petit projet perso, j'utilise des objets, threads et events pour executer diverses actions. J'ai quelques problèmes de blocage de programme

Dans le cas des messages, il existe 2 manières d'envoyer le message:
sendmessage -> attend le traitement du message
postmessage -> continue sans attendre le traitement du message

Ma question est: Comment fonctionne un event?
Lorsque je déclenche un event et qu'il est assigné ( MyIOThread.OnInChanged:=ProcessIOChanged ) , la thread source est-elle bloquée jusqu'à l'execution du code assigné (procedure ProcessIOChanged), ou ce code est-il executé par la main thread sans que la thread source soit bloquée?

Merci d'éclairer quelque peut ma (toute petite) lanterne...

Danonne

3 réponses

cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
28 nov. 2006 à 14:52
salut,

un event n'est qu'un pointeur de fonction. Donc un event déclanché depuis un thread est executer par le thread lui-même. (Pour voir comment ton event est déclanché, regarde le code source de l'object.)

Ensuite, le thread appelant est bloqué au sens ou il est entraint d'executer un bout de code.
Mais cela ne l'empeche pas de se faire appeler par un autre thread. (donc fait gaffe au RC)

l'exemple type serait un thread qui gére une queue (interne): l'event POP se fait appeler depuis le thread, mais pendant que le thread executer l'event POP, un autre thread peu faire un push. donc a toi de proteger correctement tes RC.

Si tu as des problème de synchronisation ou si tu doit toucher a l'affichage (.visible, canvas, MessageBox, ...) tu peux passer le Thread en parametre dans tes event (comme sender) et l'utiliser pour faire un TThread.Syncronize(sender, MaProcedure).

L'aide de Delphi contient quelques info utile sur la lib et les application multi-thread.

ça répond à ta question?

A+
3
Danonne Messages postés 2 Date d'inscription vendredi 24 novembre 2006 Statut Membre Dernière intervention 29 novembre 2006
29 nov. 2006 à 14:40
Salut Loda.

Merci, c'est bien ce que je pensais... Je vais donc m'atteler à faire une synchro correcte. Je vais aussi un peut plus me documenter sur le multithreading. C'est passionnant mais un peut compliqué ;-)

A+
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
30 nov. 2006 à 17:06
pour le multi thread, c'et peut-être pas une mauvaise idée de partir sur une approche "académique". cad avec un bon bouquin et de A à Z.

Surtout qu'une bonne partie des outils sont implémenter et fournit par l'OS, ce qui implique que c'est plus compliqué à comprendre qu'un composant de la VCL de Delphi...

je te conseille de faire plusieurs applications de test pour voir si t'as bien compris, AVANT de commencer à intégrer tout ça dans ton applic.

En effet, en multi thread, le pire c'est le débug. Donc on essai toujours de partie sans faire de fautes pour ne pas a avoir à debugger :D

allez, si t'as des questions, revient..

Bon code,
0
Rejoignez-nous