2012-11-27 4 views
2

J'ai écrit une bibliothèque COM DLL C# accessible par VBScript. Tout le contenu de la bibliothèque est écrit dans le programme principal sans aucune forme.Formulaire d'accès dans le fil du programme principal

Plus tard, j'ai ajouté un formulaire qui ne montre qu'un statut (comme "49% fait"). Cela a très bien fonctionné, cependant quand la DLL doit calculer beaucoup de choses, le formulaire "se bloque". Je veux que la forme soit accessible et mobile tout le temps. J'ai donc décidé de faire un propre fil pour le formulaire. Il était facile de créer le fil et le formulaire, mais j'ai de gros problèmes pour accéder à ce formulaire depuis le programme principal. Je veux juste définir le titre par exemple.

J'appelle la forme comme ceci:


namespace PART1.PART2 
{ 
    public class CLASSNAME 
    { 
     private Thread fStatus; 
     private frm_Status fStatusForm; 

     public void runShowStatus() 
     { 
      if (fStatus == null) 
      { 
       fStatus = new Thread(new ThreadStart(threadForm)); 
       fStatus.Start(); 
      } 
     } 

     private void threadForm() 
     { 
      fStatusForm = new frm_Status(); 
      Application.Run(fStatusForm); 
     } 
    } 
} 

La forme elle-même est une forme standard. Aucun code spécial jusqu'à présent.

Il y a poste similaire à cela, mais il y a deux différences principales:

  • La forme est dans un thread - le formulaire est pas dans le programme principal et la forme n'est pas la principale forme.
  • Le programme principal essaie d'accéder au formulaire - le formulaire n'essaie PAS d'accéder au programme principal.
+0

Vous êtes allé de mal en pis, VBScript ne supporte pas du tout le thread. Utilisez BackgroundWorker pour effectuer des calculs coûteux, sa méthode ReportProgress pour mettre à jour l'interface utilisateur. –

+0

Merci pour la réponse. Je ne sais rien à propos de BackgroundWorker. Peut-être pourriez-vous me donner un exemple? VBScript n'accède pas au formulaire ou à un autre thread. Il ne sait même pas qu'il y a un autre fil. (Ceci est prévu) –

+1

Un demi-million de hits Google, commencez par le haut. –

Répondre

0

Vous pouvez ajouter une variable volatile à la classe principale CLASSNAME comme ceci:

private static volatile int progress = 0; 

Maintenant, vous pouvez modifier la valeur du thread principal, et lire la valeur du fil de forme.

+0

Comment puis-je accéder à cette variable à partir d'une autre classe (la classe de formulaire)? –

Questions connexes