Problèmes avec un Pocket PC [Résolu]

Signaler
Messages postés
178
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
6 juillet 2009
-
Messages postés
178
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
6 juillet 2009
-
Bonjour,

Je suis en train de développer une application sur un Pocket PC possédant Windows Mobile 5 et j'utilise le Compact Framework 1.
Je souhaite modifier mon IHM depuis une autre thread. Afin d'y arriver, j'utilise des délégués et des invokes.

Mon code fonctionne très bien sur l'émulateur Pocket PC, mais par sur le vrai Pocket PC !

Voici un extrait dudit code :
<hr size="2" width="100%" />public delegate void maMethode();

public void chercheRepertoire()
{
   Thread t = new Thread(new ThreadStart(cherche));
   t.Start();
}

public void cherche()
{
   // recupère une liste de repertoire
   /* ... */

   maMethode meth = new maMethode(updateIHM);
   this.Invoke(meth);
}

public void updateIHM()
{
   ListViewItem lvi = new ListViewItem("tartampion");
   lvi.SubItems.Add("patate")
   this.listView1.Items.Add(lvi);
}
<hr size="2" width="100%" />
A priori, le problème semble survenir lorsque j'appelle la méthode this.Invoke(meth)

C'est bizarre, mais lorsque je remplace this.Invoke(meth) par meth(),
le code fonctionne alors très bien sur le vrai Pocket PC, mais plus sur l'émulateur!!!

Et encore, lorsque je dit qu'il fonctionne très bien, j'exagère puisqu'en fait, l'application freeze au moment de l'ajout dans listView1 (commande listView1.Items.Add(lvi)
).

Quelqu'un aurait'il une solution à ce(s) problème(s) ?

"Une chose me laisse perplexe : Est-ce moi ou les autres qui sont fous ?" A. Einstein
<!--

2 réponses

Messages postés
178
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
6 juillet 2009
4
Bon,
j'ai finalement trouvé la solution sur un site, par hasard.

Je vous la donne afin que les personnes ayant le même problème que moi (et ne
sachant pas lire l'anglais) puissent le corriger.



Ce problème semble du au fait que le Compact Framework 1 ne gère les invoke que sur des event handler... donc forcément ça crée des problèmes.

Pour les curieux, voici le site : http://blog.markarteaga.com/ControlInvokeRequiredForCompactFramework10.aspx

Pour les autes, la solution :
<hr size="2" width="100%" />privatebool
m_useInvoke = true;

privatebool
InvokeRequired

{

get

{

object controlThread = typeof(Control).GetField("m_thread",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance).GetValue(this);

if (controlThread == null)

returnfalse;

Thread currentThread = Thread.CurrentThread;

<!--[if !supportEmptyParas]--> <!--[endif]-->

return (controlThread != currentThread);

}

}

privatevoid
UpdateUICallBack(object state)

{

m_useInvoke = (bool)state; // determine si
le Invoke doit être utilisé ou non

UpdateUI(this, EventArgs.Empty);

m_useInvoke = true;

}

privatevoid UpdateUI(object sender, EventArgs
e)

{

if (m_useInvoke)

{

//
vérification de l’utilisation du Invoke

if (this.InvokeRequired)

      {

this.Invoke(newEventHandler(UpdateUI));

return;

}

}

    // Placer ici
votre code de modification de la form

}

<!--[if !supportEmptyParas]--><!--[endif]-->privatevoidBeginUpdateUI()

{
    // on utilise un file
de thread, et on place le notre dans la file d’attente

    ThreadPool.QueueUserWorkItem(newWaitCallback(UpdateUICallBack), true);

}

<hr size="2" width="100%" /><!--[endif]-->

Nous utilisons m_thread qui se trouve être un
membre privé appelé par System.Windows.Forms.Control et qui stocke le thread
crée sur le contrôle.
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
bonjour,

je te conseille de poser ta question sur le forum de www.pdafrance.com ou de www.codeppc.com, tu auras plus de chance de recevoir une réponse à ta question.

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]