J'utilise une bibliothèque tierce pour communiquer les données d'un périphérique d'entrée tiers vers un Windows Form. Ce que je cherche à faire est de recueillir des données d'entrée à partir de l'appareil, le traiter et, sous certaines conditions, faire rapport sur le fil de l'interface utilisateur de Windows ce qui se passe. Je n'ai pas accès au code source de la DLL tierce mais je sais que la méthode principale est sur un processus en arrière-plan et que je ne peux pas communiquer mes résultats sur le thread principal de l'interface utilisateur parce que je ne l'ai pas créé?La bibliothèque multithread utilisant le thread de travail ne peut pas communiquer avec l'interface utilisateur Thread
Windows Form:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// create instance of my listener
MyListener listener = new MyListener(this);
Controller controller = new Controller(listener);
}
}
MyListener classe qui étend la 3e classe du parti Listener:
public class MyListener : Listener
{
public Form1 form;
private Frame frame;
// overloaded constructor
public LeapListener(Form1 f)
{
form = f;
}
/// <summary>
/// onFrame is the main method that runs every milisecond to gather relevant information
/// </summary>
public override void onFrame(Controller controller)
{
// Get the most recent frame and report some basic information
frame = controller.frame();
}
}
Le problème est que je peux communiquer revenir au thread principal de l'interface utilisateur de partout dans la classe de MyListener mais Je ne peux pas communiquer à partir de la méthode onFrame car il s'exécute sur un thread d'arrière-plan. Y a-t-il de toute façon une prise en main du thread principal à partir d'un thread d'arrière-plan que je n'ai pas créé? J'ai essayé ReportProgress, j'ai essayé de créer un événement sur MyListener et toutes les tentatives de parler au thread principal de l'interface utilisateur de onFrame plantent l'application et me donnent des erreurs d'emplacement de mémoire invalides.
Toute aide serait grandement appréciée.
'Y a-t-il un moyen d'obtenir le thread principal à partir d'un thread d'arrière-plan que je n'ai pas créé?' - Bien sûr, le problème en suspens est ce que vous avez dans votre C++/C#/quoi que ce soit pour le faire. En règle générale, il s'agit des méthodes Invoke/BeginInvoke fournies par le langage/bibliothèque ou des API SendMessage/PostMessage. Wot vous avez? –
Est-ce que 'Controller' l'objet s'exécute dans un thread différent? – didierc