2010-02-18 7 views
2

Exécution en nature d'un problème étrange:ActiveX dans Delphi blocage thread VCL

J'utilise delphi 6.0 et essayer d'intégrer un contrôle activeX tiers qui se connecte à un serveur, flux et rend la vidéo (aucune visibilité sur ce contrôle).

Le contrôle a un paramètre de fréquence d'images de 1 à 30 et si je le règle sur une petite valeur comme 1, le thread VCL semble bloquer pendant une seconde toutes les secondes. En d'autres termes, il semble que lorsque le rendu vidéo est effectué à l'intérieur de ce contrôle ActiveX, il dort pendant le temps jusqu'à ce qu'il ait besoin de rendre la trame suivante, mais c'est une spéculation de ma part. En regardant dans le registre, je vois que ce contrôle est threading Apartment, donc je pensais que la façon dont cela doit se passer est que j'ai créé le contrôle sur le thread VCL et donc le thread de rendu dans le contrôle est marshalled pour fonctionner sur le Le thread VCL (qui n'a pas vraiment de sens pour les threads internes au contrôle à gérer est-il fait?) Et en raison d'une logique de veille, il bloque le thread VCL. Sur la base de ce que j'ai pensé si j'ai créé un thread dédié pour créer ce contrôle (avec une fenêtre cachée + une pompe de message), les sleepps se produiraient sur ce ActiveXCreatorThread au lieu de VCL. Le contrôle ActiveX est créé en utilisant CreateParented (Fowner). Inutile de dire que cela n'a pas fonctionné et le thread VCL continue à bloquer de la même manière et je suis perplexe. D'après vous, qu'est-ce qui cause le comportement original? et pourquoi mon hack n'aurait-il pas fonctionné?

Merci!

+0

Had quelques réflexions supplémentaires, mais n'ont pas été en mesure de retrouver le code dans les bibliothèques VCL: dans le second cas quand je créé le activex sur un thread différent, comment serait-il même capable d'exécuter du code sur le thread VCL? Je soupçonne que le mécanisme est un marshaling qui implique l'envoi d'un message à la poignée de peut-être le parent du contrôle activex? ainsi, le parent créé dans vcl provoque le traitement des messages sur vcl qui provoque le blocage. Quelqu'un peut-il confirmer un tel mécanisme? –

Répondre

1

Je suppose que c'est un contrôle avec une interface utilisateur qui, d'une manière ou d'une autre, s'exécute toujours dans le thread principal de l'interface utilisateur. Je ne sais pas comment cela est accompli avec ActiveX, mais il va de soi que cela devrait se produire de cette façon puisque l'interface utilisateur doit être mise à jour par un thread.

Pas sûr que cela aide beaucoup. Le seul travail auquel je peux penser est de lancer le contrôle dans un exe séparé.

Questions connexes