Actualisation de la form a partir d'un thread. [Résolu]

Signaler
Messages postés
11
Date d'inscription
vendredi 3 janvier 2003
Statut
Membre
Dernière intervention
17 octobre 2007
-
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
-
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

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
44
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#
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
44
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#
Messages postés
11
Date d'inscription
vendredi 3 janvier 2003
Statut
Membre
Dernière intervention
17 octobre 2007

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 ?
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
44
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#
Messages postés
11
Date d'inscription
vendredi 3 janvier 2003
Statut
Membre
Dernière intervention
17 octobre 2007

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