2010-09-21 32 views
1

Je développe une application au cours de la version 2008 et j'utilise un agent d'arrière-plan pour copier des fichiers. J'ai ma propre forme conçue qui joue une animation sur le dessus du formulaire avec la copie. Pour la lecture d'animation en utilisant "AxMSComCtl2.AxAnimation", lors de l'exécution je reçoisExécution d'une animation dans le fond d'écran

"Contrôle ActiveX" ne peut pas être instancié car le thread actuel n'est pas dans un appartement monothread. "

sur la recherche, j'ai trouvé un lien: Forum Link

Mais encore ce lien Tout d'abord je ne comprends pas où insérer cet extrait et d'autre part comment mettre en œuvre l'idée de travailleur de fond.

Veuillez me guider à cet égard.

Merci & Cordialement,

Maverick.

Répondre

0

Vous devez utiliser un délégué et laisser le thread principal contrôler l'animation. Vous appelez le délégué du thread d'arrière-plan, mais il s'exécute dans le thread principal. Cette page, deuxième post, a l'idée approximative: http://www.vbforums.com/showthread.php?t=377205

1

Vous ne pouvez pas utiliser BackgroundWorker pour animer ce contrôle. C'est un contrôle ActiveX, il nécessite que vous le créiez dans le thread principal de votre application. Le même fil qui crée la forme.

Il s'agit d'une restriction très courante pour les contrôles en général, ils ne prennent pas en charge l'enfilage.

Le fil lié ne résout pas votre problème. Oui, vous pouvez créer votre propre thread STA en appelant SetApartmentState() et en spécifiant STA mais maintenant vous ne pouvez rien faire avec le formulaire que vous avez créé sur le thread principal. Vous obtiendrez une exception lorsque vous ajoutez le contrôle au formulaire. Les contrôles enfants d'un formulaire doivent être créés dans le même thread que le formulaire.

Cela ne devrait en général pas être un problème. L'animation devrait être raisonnablement lisse tant que vous gardez les gestionnaires d'événements du formulaire courts et rapides. Si un tel gestionnaire d'événements doit faire quelque chose qui prend du temps (et fige l'animation), laissez un BGW effectuer ce travail.