2010-11-04 5 views
3

Lors du débogage des threads d'arrière-plan à l'aide de Visual Studio 2010, existe-t-il un moyen agréable de laisser les autres threads s'exécuter pendant quelques centaines de millisecondes sans avancer un thread qui se trouve à un point d'arrêt? Équivaut en effet à insérer "Threading.Thread.Sleep (100)" juste avant la ligne en cours, en définissant la déclaration suivante, et en tapant resume (mais sans pirater le code en cours de débogage)? Mon code d'enregistrement de paquets/affichage n'est pas aussi utile qu'il pourrait l'être, car le débogueur atteindra souvent un point d'arrêt entre le moment où mon code a agi sur un paquet et le moment où l'interface utilisateur a réussi à l'afficher.Un moyen d'exécuter brièvement Thread UI lorsque le thread non-UI est arrêté dans le débogueur?

Je sais qu'il est possible d'aller dans la fenêtre Threads, geler le fil qui a frappé le point d'arrêt, hit run, hit pause, et décongeler le fil qui a frappé le point d'arrêt, mais c'est vraiment maladroit. Y a-t-il une façon plus simple de faire les choses?

(Éditer) Pourquoi pas de réponse? Je ne peux pas croire que je suis la seule personne à essayer de déboguer un thread non-UI.

Répondre

3

Je voudrais utiliser une macro dans Visual Studio pour effectuer des actions telles que celle que vous définissez.

Il devrait s'agir simplement d'enregistrer la macro (Tools, Macros, Record TemporaryMacro) au bon moment, puis de l'enregistrer.

Vous pouvez toujours ajouter un raccourci clavier/icône pour exécuter de nouveau la macro ultérieurement.

Ou même ajuster le code source à la macro pour s'assurer qu'il effectue votre action exactement comme nécessaire.

EDIT # 1: Comme un soupçon j'imagine le code ressemble un peu à ce (non testé):

Dim t As Thread 
    t = DTE.Debugger.CurrentThread 
    t.Freeze() 
    DTE.Debugger.Go(False) 
    Beep() 
    Threading.Thread.Sleep(5000) 
    Beep() 
    DTE.Debugger.Break(True) 
    DTE.Debugger.CurrentThread = t; 
    t.Thaw() 

EDIT # 2: Vous pouvez vous référer à ceci: EnvDTE.Debugger

importations standard pour votre référence:

Imports System 
Imports EnvDTE 
Imports EnvDTE80 
Imports EnvDTE90 
Imports EnvDTE90a 
Imports EnvDTE100 
Imports System.Diagnostics 
+0

Comment dois-je la macro fonctionne-t-elle? Il devrait geler le thread en cours et exécuter d'autres threads pendant un certain temps, puis libérer le thread en cours. Si je fais des choses manuellement, je peux voir quel thread est le thread courant et juste le geler, mais je ne suis pas au courant de la commande "geler le thread courant", et je ne suis pas conscient de toute commande qui provoquerait une macro patientez pendant que les autres threads durent un certain temps. – supercat

+0

Lundi, je testerai des threads de gel/dégel pendant qu'un enregistrement macro est en cours pour voir ce qui est enregistré, mais je ne suis pas sûr des commandes que je pourrais enregistrer qui permettraient d'obtenir le résultat désiré indépendamment des threads assignés ids. BTW, si j'ai essayé de faire "Threading.Thread.Sleep (100)" dans la fenêtre immédiate, mais tous les threads sont gelés quand cela fonctionne. Merci pour votre aide - Je vous tiendrai au courant lundi de ce qui se passe. – supercat

+0

J'ai ajouté un exemple de ce à quoi le code pourrait ressembler. –

Questions connexes