Je dois exécuter du code dans le contexte du thread principal. J'utilise Lazarus + FPC. Je reçois un événement d'un thread à l'intérieur d'une DLL (bibliothèque partagée si sous Linux) et ma fonction de rappel est appelée. Notez que cette fonction n'est membre d'aucune classe mais une fonction traditionnelle autonome avec une directive "cdecl" attachée.Exécuter du code dans le contexte du thread principal (Lazarus)
Je dois trier un gestionnaire d'événements de propriétés correspondant à chaque message que je reçois. Et ces événements doivent être transmis dans le contexte du fil principal. Je connais deux de ces solutions:
- PostMessage
- Application.QueueAsyncCall
Le premier est ok, mais il faut une poignée de fenêtre. Et comme il s'agit d'un code de bibliothèque, aucune poignée n'est disponible. AllocateHWND n'est pas une option car il n'est pas multi-plateforme. Je sais que je peux créer une forme fictive mais c'est une très mauvaise solution
La seconde fonctionne bien, mais j'ai un problème, que l'appel n'est pas traité jusqu'à ce que je déplace une souris dans l'application par exemple. Peut-être que je fais quelque chose de mal, je ne sais pas. C'est comme si mon appel était en cours de traitement seulement quand le traitement des messages intervient. Mais cela peut être une longue attente apparemment.
Donc, je veux savoir quelle est la meilleure solution ici (probablement QueueAsyncCall) et comment je peux être sûr que mon message (appel) sera traité dans des délais acceptables?
Je suis bien conscient que je ne peux pas être sûr à 100%, mais mon application ne fait rien et toujours les appels ne sont pas traités jusqu'à ce que je bouge la souris. Donc, je suis mieux avec PostMessage. Mais l'inconvénient est que AllocateHWND n'est pas encore implémenté en mode crossplatform. Ou est-ce? Je pensais que Application.QueueAsyncCall était threadsafe. Je vais vérifier la mise en œuvre. Merci pour la réponse si. J'ai beaucoup d'expérience dans l'environnement multithread mais je suis assez nouveau à Lazarus. Ainsi les problèmes :) – Runner
L'horreur :) Il est vraiment pas threadsafe. Donc, existe-t-il une alternative à la messagerie en dehors de PostMessage? Je veux dire simple, pas IPC ou TCP/IP? – Runner
Pas vraiment. Je suppose qu'ils ont eu la peine de mettre en place une émulation post-message sur d'autres plateformes pour une raison. –