2015-08-06 4 views
0

J'ai essayé de modifier une application développée par d'autres dans le passé ...Threading ... Démarrer/suspendre ..set/reset

cette application ne trading en ligne (en utilisant api développé pour C#) .. donc fondamentalement j'ai la structure de l'application où je définis quelques paramètres de configuration que l'utilisateur peut vérifier ou décocher et il y a bouton de démarrage et d'arrêt

en cliquant sur le bouton de démarrage .. je crée un fil en passant la fonction qui fera tout le singe et d'autres choses et l'assigner à la classe principale

betbot _mybot = this; # mybot is form class 
this.main_thread = new Thread(new ThreadStart(_mybot.aping_function); 
this.main_thread.Start(); 

et cliquant sur le bouton d'arrêt ,,, app est suspendait simplement le fil

this.main_thread.Suspend() 

maintenant les arrêts app et seule façon de reprendre la fonction d'application (singerie) est à appuyer sur le bouton de démarrage et relancer fil ..

en tant que nouvelle fonctionnalité, je veux ce thread pour arrêter et redémarrer automatiquement ..every temps il frappe certaine perte d'arrêt et recommencer ... mais je ne pouvais le faire

ce que j'ai fatigué est ManualResetEvent comme suivant

private static ManualResetEvent mrse = new ManualResetEvent(true); 

lorsque certains événement correspond à la méthode de aping_function je fais mrse.reset() et mrse.set() .. mais qui semble avoir pas d'effet (pas redémarrer complètement)

if (stop_loss_condition_met) 
{ 
    this.Print1("Bot Is stopped Automatically"); 
    mrse.Reset(); 
    this.Print1("Bot Is re-started Automatically"); 
    mrse.Set(); 
} 

Comment puis-je parvenir

Répondre

0

Vous devez ajouter un appel de la méthode WaitOne à l'endroit où votre thread de travail doit s'arrêter.

mrse.WaitOne() 

à la prochaine fois que le code de réinitialisation externe par appel

mrse.Reset() 

l'exécution sera arrêté et le fil se mettra en veille jusqu'à ce que Set d'appel de code externe au point

mrse.WaitOne() 

méthode du ManualResetEvent

mrse.Set() 
+0

Donc, j'ai côté mon aping_function je crée un while (true) {mrse.WaitOne() et puis à l'intérieur de ma condition if si je vais faire mrse.reset() et mrse.set() dans le même ordre que ..next. Suivant ... le thread s'arrêtera là et redémarrera à partir de WaitOne line..right? – MrPandav

+0

Oui, vous avez raison –