J'ai créé une application multichilded. Les fenêtres d'application (W [n]: TMyWindows) sont toutes identiques et toutes sont associées à une instance de classe d'objet privée (E: TMyObject). Les fenêtres enfants génèrent à travers ces objets des messages. J'ai créé dans l'application principale deux threads qui traitent ces messages en fonction du contenu des messages. Par exemple permet d'avoir les appels asynchrones suivants:postthreadmessage et peekmessage problème dans delphi 2006
W[1].E.Service(thread1service)
W[2].E.Service(thread2service)
le TMyObject.Service (servicetype) est
case servicetype of
thread1service: PostThreadMessage(thread1id,...);
thread2service: PostThreadMessage(thread2id,...);
end;
Maintenant, dans la méthode d'exécution chaque thread j'ai quelque chose comme ça:
while not terminated do
begin
...
if peekmessage(msg,0,thread1message_1,thread1message_n,pm_remove) then
process message
do other things;
end
Tout va bien sauf que le deuxième thread ne reçoit aucun message. Avez-vous une idée pourquoi?
Pas nécessairement. Donnez à chaque thread une file d'attente FIFO, protégée par une section critique, et ajoutez un événement à patienter.Signaler l'événement lorsque le FIFO n'est pas vide. – mghie
J'ai pensé à cela, mais si le thread principal met beaucoup de massages dans la file d'attente, le thread de travail sera obligé de les traiter, et le thread de travail fait des tâches critiques dans sa boucle. Ainsi, si le thread de travail traite un message quelconque, le thread principal vide les nouveaux messages au lieu de les envoyer au thread de travail. – zoomz
Triste vraiment, une file de messages de fil aurait été idéale. Je me demande toujours pourquoi ça ne marche pas pour toi. J'ai vérifié ma mise en œuvre de cela et vous ne semblez pas faire quelque chose de mal de ce que vous dites. :( – Nat