Actualisation de la form a partir d'un thread.

Résolu
bwoufy82 Messages postés 11 Date d'inscription vendredi 3 janvier 2003 Statut Membre Dernière intervention 17 octobre 2007 - 30 janv. 2006 à 09:24
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 - 30 janv. 2006 à 13:57
Bonjour a tous.
Voiladepuis 3 jours je n arrive pas a trouver comment faire pour que mon thread accede a ma form.
J'esxplique se que je cherche a faire :

J'ai un thread dans un namespace different de celui de ma form et je recois par l intermediaire du tcp/ip
une activation. Lorsque cette valeur est recue, je dois faire apparaitre ma fenetre graphique (qui etait en tray icone) a l'ecran.

J'ai essayé d utiliser des delegate mais je suis perdu.

j aimerai sinon savoir comment faire pr recuperer le pointeur de la vu dans mon thread. Ou alors ya t-il d'autre solutions ?

Merci d avance

5 réponses

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
30 janv. 2006 à 13:57
Quand tu instancies la classe dans laquelle se trouve ton thread, passe lui la reference de ta classe MonAppDlg (via la constructeur par exemple).

Petit exemple


<HR>

namespace namespace1
{

public
class
TestForm :
Form
{

public
delegate
void
ShowFormDelegate();

public
void ShowForm()
{

this.Visible = !
this.Visible;
}


public TestForm()
{

ThreadListener tl =
new
ThreadListener(
this);
}
}
}


namespace namespace2
{

public
class
ThreadListener
{

public
TestForm form;

public ThreadListener(
TestForm form)
{

this.form = form;

Thread t =
new
Thread(
new
ThreadStart(ThreadMethod));
t.Start();

}



private
void ThreadMethod()
{

while (
true)
{

Thread.Sleep(1000);
form.Invoke(
new
TestForm.
ShowFormDelegate(form.ShowForm),
null);
}
}
}
}


<HR>



Mx
MVP C#
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
30 janv. 2006 à 09:53
Salut,
As-tu lu ce tutorial?

Sinon, je pense qu'on t'aidera plus facilement si tu nous presente nu bout de code ;)




Mx
MVP C#
0
bwoufy82 Messages postés 11 Date d'inscription vendredi 3 janvier 2003 Statut Membre Dernière intervention 17 octobre 2007
30 janv. 2006 à 10:35
Merci bien pour ce tutoriel, oui je l'avais regardé mais je n arrive pas a l utiliser car il me dit le debugeur d'utiliser une methode static.
Cela doit etre parceque je ne suis pas dans le meme namespace.

Voila le code du thread :
--------------------------------------------------------------------------------------------------------
namespace Server {

public sealed class ServerNamedPipe : IDisposable {
internal Thread PipeThread;
internal ServerPipeConnection PipeConnection;
internal bool Listen = true;
internal DateTime LastAction;
private bool disposed = false;

enum constIpc
{
AFFICHER_DIALOG = 10,
PASSWORD_OK,
PASSWORD_REFUSE,
};

private void traiterRequete(string requete)
{
string sParam0;
Thread.BeginCriticalRegion();
Console.WriteLine("IPCCom valeur recue : " + requete);

if (this.requeteRecue(ref requete, out sParam0) == 0) // si requete valide
{
switch (int.Parse(sParam0))
{
case (int)constIpc.AFFICHER_DIALOG:

// ici a faire apparaitre la fenetre graphique

break;
}
}

-------------------------------------------------------------------------------------------------

et le code de ma partie graphique :

namespace MonAppDlg
{
public partial class AppDlg : Form
{

public delegate void afficherFenetreHandler(int val);
public afficherFenetreHandler afficherFenetre;

public void afficherFenetreDlg(int step)
{
// Mise à jour de la barre de progression
this.Show();
}

public MonAppDlg()
{
InitializeComponent();
afficherFenetre = new afficherFenetreHandler(afficherFenetreDlg);
}

....

---------------------------------------------------------------------------------------
Voila ca compil sans erreur mais quand j utilise la ligne pour le Invoke,
il ne le trouve pas et me retourne des erreurs.
Que dois je mettre comme ligne ?
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
30 janv. 2006 à 11:11
En fait, il faut que ton Thread connaisse ton instance de MonAppDlg.
Ensuite, dans la méthode associée au thread, tu n'as plus qu'a faire

monApp.Invoke(new afficherFenetreHandler(afficherFenetreDlg), tonEntierAPasserEnParam);

monApp etant ton instance de MonAppDlg.


Mx
MVP C#
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bwoufy82 Messages postés 11 Date d'inscription vendredi 3 janvier 2003 Statut Membre Dernière intervention 17 octobre 2007
30 janv. 2006 à 11:38
quand tu parle d'instancier, c'est que le thread doit avoir l'adresse de la fenetre graphique c'est ca ?
Pour l'instancier je dois declarrer une variable de ma fenetre dans mon thread.
Si c'est ca mais ensuite comment faire pour l initialiser ?

j dû mal a comprendre l'instanciation sous c#, prefere le C++
hihi
0
Rejoignez-nous