2017-10-21 98 views
2

J'ai vu que mon application Delphi a plus d'un fil - 7 plus exactement. Bien sûr, je ne crée pas mes propres threads et j'utilise uniquement des contrôles VCL «classiques». Le programme est inactif. Il affiche simplement le formulaire principal. Aucune boîte de dialogue n'est active, aucun thread personnel/Indy/etc n'est en cours d'exécution. N'est pas supposé avoir un seul thread (le thread principal VCL)Pourquoi une application Delphi a plus d'un thread?

  1. Comment puis-je savoir lequel de ces threads (déjà en cours d'exécution) est le thread principal?

Note 1: Ceci est lié à Program freezes but the CPU utilization is zero
Note 2: Je viens de réaliser que 2 ou 3 de ces fils sont du débogueur (threads supplémentaires apparaissent lorsque je fais une pause le programme et invoque la « CPU vue 'fenêtre).

+0

fins Fordebugging vous pouvez attribuer un nom Threads. – nil

+0

@nil - Je connais les threads nommés. MAIS comment cela peut-il aider dans mon cas spécifique? Ça ne peut pas. – Ampere

+1

Le point 2 du puits le demande. Nommez-le 'Principal'. Il y a MainThreadID et CurrentThread pour aider à identifier. Au cours du démarrage de votre programme, le CurrentThread devrait être le principal je suppose. – nil

Répondre

2

Comme vous le voyez dans les commentaires une réponse à la première partie de votre question est large. Juste en créant un nouveau projet 'Application VCL Forms' dans Delphi XE7 et en l'exécutant, j'avais 4 Threads dans la vue 'Thread Status'. D'autres ont mentionné TThreadedQueue, les boîtes de dialogue de fichiers, le code d'indice VCL et plus encore comme source pour les threads non comptabilisés.

Pour la deuxième partie de votre question, je suggère de nommer le thread principal au démarrage avec quelque chose comme:

TThread.NameThreadForDebugging('Main Thread', MainThreadID); 

Comme vous le mentionnez dans les commentaires que vous pourriez ne pas être en mesure de le nommer au préalable, donc dans un existant session de débogage vous pouvez le faire ad hoc:

  • afficher la fenêtre Evaluer/Modifier

    • Ctrl +F7ou
    • Contexte Menu> Test> Evaluer/Modifier
  • Tapez MainThreadID comme expression eveluate, entraînant l'ID que vous recherchez.
  • Si vous le souhaitez, vous pouvez utiliser l'entrée de menu contextuel 'Name Thread' dans la vue Thread pour nommer le thread avec cet ID.

Thread Status with names

L'identification d'autres threads avec l'IDE est possible aussi. Un double-clic sur un thread dans la vue Threads ouvrira la pile d'appels en cours. En parcourant ce que vous pourriez déjà être en mesure de dire s'il s'agit d'un thread Delphi natif ou externe.

Par exemple l'un des « non identifiés » - externes - fils, je ne l'ai pas créer a la suite pile d'appel:

enter image description here

Alors qu'un fil Delphi j'ai créé à des fins de test a la suite, où les unités Delphi sont reconnaissables:

enter image description here