Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Fermeture d'une fenêtre

3 réponses
Avatar
Clément
Bonjour à tous,

Je cherche à développer une application succeptible d'ouvrir, à partir d'un
MainForm (non MDI), une ou plusieurs autres fenêtres.
Mon souci, c'est à la fermeture d'une de ces fenetres. A l'exécution de la
méthode Close, l'application plante.

Après quelques recherches, j'ai réalisé que le problème vennait que je ne
travaillais pas avec le bon thread. J'ai centré mon attention sur le
InvokeRequired.

J'ai alors procédé de la manière suivante (voir code ci-dessous) mais je
reste perplexe (bien que cela fonctionne), car la mémoire ne semble pas se
libérer correctement (en regardant dans le gestionnaire des tâches).

Auriez-vous la gentillesse de m'aider, et/ou me communiquer une manière
éventuellement plus propre de gérer ce genre de problème ?

D'avance, merci

Clément


Code :

delegate void CurrentFormDelegate(object sender, int r);
delegate void CloseCallBack();

private void CloseCurrentForm(object sender, int r)
{
if (this.InvokeRequired)
this.Invoke(new CurrentFormDelegate(CloseCurrentForm), new
object[] { sender, r });
else
{
CloseCallBack closeDelegate = new CloseCallBack(this.Close);
closeDelegate.BeginInvoke(new AsyncCallback(CallBackEnd),
closeDelegate);
}
}

void CallBackEnd(IAsyncResult ar)
{
if (InvokeRequired)
{
Invoke(new AsyncCallback(CallBackEnd), new object[] { ar });

return;
}

Close();
}

3 réponses

Avatar
Delf
Le 02/10/2009, Clément a supposé :

Je cherche à développer une application succeptible d'ouvrir, à partir d'un
MainForm (non MDI), une ou plusieurs autres fenêtres.
Mon souci, c'est à la fermeture d'une de ces fenetres. A l'exécution de la
méthode Close, l'application plante.

Après quelques recherches, j'ai réalisé que le problème vennait que je ne
travaillais pas avec le bon thread. J'ai centré mon attention sur le
InvokeRequired.



Bonsoir.

Si je comprends bien, la MainForm ouvre une FormX via quelque chose du
genre :

FormX myForm = new FormX();
myForm.Show();

Pourquoi ne pas définir une méthode public dans FormX :

public void Close()
{
this.Close();
}

Et ainsi faire dans le MainForm :

myForm.Close();
myForm.Dispose();

Je ne sais pas si ça marche.

--
D.
Avatar
Richard Clark
N'aurais tu pas créé l'une des fenêtre dans un autre Thread ?

Richard Clark
http://www.c2i.fr
Le 1er site .NET


Delf a écrit :
Le 02/10/2009, Clément a supposé :

Je cherche à développer une application succeptible d'ouvrir, à partir
d'un MainForm (non MDI), une ou plusieurs autres fenêtres.
Mon souci, c'est à la fermeture d'une de ces fenetres. A l'exécution
de la méthode Close, l'application plante.

Après quelques recherches, j'ai réalisé que le problème vennait que je
ne travaillais pas avec le bon thread. J'ai centré mon attention sur
le InvokeRequired.



Bonsoir.

Si je comprends bien, la MainForm ouvre une FormX via quelque chose du
genre :

FormX myForm = new FormX();
myForm.Show();

Pourquoi ne pas définir une méthode public dans FormX :

public void Close()
{
this.Close();
}

Et ainsi faire dans le MainForm :

myForm.Close();
myForm.Dispose();

Je ne sais pas si ça marche.

--
D.




Avatar
Patrice
Je prendrais plutôt le problème dans l'autre sens. Si ce n'est pas un
comportement que tu recherches explicitement pourquoi une fenêtre s'ouvre
t'elle dans un autre thread ? Et je modifierai donc mon code pour que toutes
les fenêtres s'ouvrent dans la même thread. Cela sera je pense bien simple.

Et c'est pas bien de parler d'une erreur sans donner son texte exact ;-) Il
est éventuellement possible qu'une erreur dans son interprétation te lance
sur une fausse piste...

--
Patrice