Aller au contenu

Appliquer un résultat quand on est dans un worker


Arcy

Messages recommandés

'jour,

Je travaille sur une application qui doit capturer des touches et cette partie est terminée.

private System.ComponentModel.BackgroundWorker worker = new System.ComponentModel.BackgroundWorker();

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern int GetAsyncKeyState(Keys vKeys);

public MainWindow()
{
  	worker.DoWork += new System.ComponentModel.DoWorkEventHandler(backgroundWorker_DoWork);
  	worker.RunWorkerAsync();
}

private void backgroundWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    bool continue = true;

    while (continuer)
    {
      if (GetAsyncKeyState(Keys.A) != 0) // uniquement après avoir appuyé sur A
      {
          maFonctionA();
      }
      else [...]
    }
}

Pour que cette solution tourne en boucle, j'ai ouvert un autre thread (worker) auquel j'ai collé une boucle infinie (que je peux arrêter dans certaines circonstances).

Le problème se situe après avoir appuyé sur une touche (ici, A) dans maFonctionA(), quand elle est appelée via le BackgroundWorker ...

maFonctionA()
{
	[...]
}

=> Erreur : "Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire."

Du coup, je sèche pour ce point là. Il s'agit d'une fonction essentielle qui, même si elle me bloque pas actuellement, le sera plus tard.

 

A vos idées ! ;-)

Lien vers le commentaire
Partager sur d’autres sites

Il y a 20 heures, Aloyse57 a dit :

Je vois plein de références sur le net parlant de "dispatcher" et "delegate"...

'lut,

J'ai également vu ce genre de contenu mais en fouillant un peu plus, certains voulait contourner ce problème en passant par un BackgroundWorker (ce que j'avais fait à la base, ça répondait pas trop à ma question ...).

Du coup, via ce sujet, j'ai pu me contenter de

Dispatcher.Invoke((Action)maFonctionA);

Et au passage, j'ai appris l'utilité du Invoke ;-)

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...