Fermer une fenêtre principale [Résolu]

Signaler
Messages postés
37
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
2 septembre 2010
-
DIMUSERS
Messages postés
37
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
2 septembre 2010
-
Bonjour à tous,
Voilà mon pb.
Dans mon programme j'ai un évennement toutes le 40 ms. Durant cet évennement je dois faire une action à intevale régulier (toutes les 3/4 ms). Pendant les instervales, pour permettre à un thread sous jascent (défilement d'une video directshow) de s'exécuter sans mettre le proc à genoux, je souhaite endormir le thread qui contient la boucle citée précédemment (ce thread est celui de ma fenêtre principale). Jusque là je m'en sort (avec sleep(3) ). Mais en plus de ça, je voudrais aussi que ce thread endormi presque tout le temps reste sensible aux messages de l'utilisateur pour éventuellement arrêter la vidéo ou tout simplement sortir de l'application.
Pour exemple je fourni un petit source sensé simuler cela (une fenêtre dans laquelle tourne une boucle infinie et un thread endormi qui ne se termine jamais). Le programme ci-joit fonctionne, mais on ne peut pas l'arrêter (!) en cliquant sur la croixant sur la croix en haut à droite de la fenêtre principale. Et la ça ne marche pas.
Pourtant, j'utilise Thread.Join() qui selon la donc n'interromp pas la pompe à message.
Quelqu'un a une solution ?


using System;



using



System.Collections.Generic;


using



System.ComponentModel;


using



System.Data;


using



System.Drawing;


using



System.Text;


using



System.Windows.Forms;


using



System.Threading;


namespace



WindowsApplication2{


public



partial



class



Form1
:

Form

{







int
Compteur = 0;


bool
DemarrerBoucle;


static



Thread
SleepingThread;


public
Form1(){

InitializeComponent();

SleepingThread =


new



Thread
(

new



ThreadStart
(SleppingMethod));SleepingThread.Start();

}


// Termine le thread dormant à la fermeture de la fenêtre principale






// lorsque l'utilisateur clique sur la croix.






private



void
Form1_FormClosed(

object
sender,

FormClosedEventArgs
e){

SleepingThread.Abort();

}


// Le thread dormant






void
SleppingMethod(){


Thread
.Sleep(System.Threading.

Timeout
.Infinite);}


// Lancement de la boucle infinie






private



void
DemarreBoucleInfinie_Click(

object
sender,

EventArgs
e){

DemarreBoucleInfinie.Enabled =


false
;


while
(

true
){

SleepingThread.Join(1000);

Compteur++;

}

}

}

}



 

4 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29
Salut, Application.DoEvents( ) dans la boucle.
Messages postés
37
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
2 septembre 2010

Merci,
J'ai essayé, ça ne marche pas. cf http://www.codinghorror.com/blog/archives/000159.html.
Pour résumer, doevent() est un appel asynchrone (qui n'attends pas la fin de son exécution pour retourner). Il s'en suit que des appels successifs et rapides embolisent le system et provoquent des débordements de pile qui se soldent par des blocages.
J'avais déjà exploré cette solution, mais sans vraiment comprendre pourquoi ça ne marchait pas. La moindre des choses était de te répondre de façon constructive et instructive (pour moi au moins).
Encore merci.
E. Laplane
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
29
je connais cet article.. cela dit DoEvents est bien pratique dans une boucle sans fin pour ne pas freezer la forme, c'est vrai que ça à tendance à monter en charge le CPU, pour éviter ça en général je colle un petit Thread.Sleep juste après.. Une solution plus élégante c'est un PeekMessage dans Application.Idle, bref peu importe ça ne convient pas dans ton cas, j'aurais du tester avant.
Messages postés
37
Date d'inscription
jeudi 8 juin 2006
Statut
Membre
Dernière intervention
2 septembre 2010

Finalement, c'est moi qui ai entièrement tord. Ca convient tout à fait, et finalement il vaut peut-être mieux ne pas tester (comme tu dis avoir fait) que mal tester comme j'ai fais. Toute mes excuses pour le ton doctoral de ma réponse, j'adopte ta solution et je replonge dans mon barard.
Pour quand même sauver mon amour propre, je me dis que l'implémentation de doevent a peut être changé avec les versions de W...
Signé : La truffe du jour.