Fermer une fenêtre principale

Résolu
DIMUSERS Messages postés 37 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 2 septembre 2010 - 15 mars 2008 à 16:21
DIMUSERS Messages postés 37 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 2 septembre 2010 - 16 mars 2008 à 17:01
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

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
15 mars 2008 à 18:37
Salut, Application.DoEvents( ) dans la boucle.
3
DIMUSERS Messages postés 37 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 2 septembre 2010
15 mars 2008 à 20:11
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
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
16 mars 2008 à 08:18
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.
0
DIMUSERS Messages postés 37 Date d'inscription jeudi 8 juin 2006 Statut Membre Dernière intervention 2 septembre 2010
16 mars 2008 à 17:01
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.
0
Rejoignez-nous