2016-06-15 6 views
0

Ich habe eine C++ - Anwendung (Funktionen eines SDK für eine bestimmte Hardwarekomponente aufrufen), und möchte seine Daten in einer C# -GUI anzeigen. Der C# -Teil ist eine DLL, die C++ aufruft. (Dies ist auf Anfrage vom Kunden, so habe ich nicht viel Auswahl.)C++ - Code die GUI in C# DLL aktualisieren

Ich bin nicht sehr gut in C#, also möglicherweise etwas offensichtliche fehlen, aber ich habe Probleme mit beiden angezeigt die GUI und aktualisieren sie.

ich Zugriff auf den C# -Code mit this method, mit dem Code in etwa wie folgt aus (ptr ist eine Klassenvariable):

// Initialize COM. 
CoInitialize(NULL); 

ptr = new IPtr(__uuidof(ManagedClass)); 
(*ptr)->ShowForm(); 

dann in einem anderen Thread:

if (updating) (*ptr)->Update(data) 

Auf der C# Seite haben wir :

FormClass myForm; 
void ShowForm() 
{ 
myForm = new FormClass(); 
Application.Run(myForm); 
} 
void Update(Data data) 
{ 
myForm.Update(data) 
} 

Wenn ich Application.Run oder ShowDialog zu s verwende Wie meine GUI aussieht, zeigt das Formular schön an, aber das Update bringt die Anwendung zum Absturz. Mit Show ist die GUI nicht mehr erreichbar. Die Verwendung von BeginInvoke führte dazu, dass die GUI nie erschien.

Gibt es eine empfohlene Möglichkeit für mich, die GUI bei dieser Einrichtung zu starten? Wäre es hilfreich, Invoke/BackgroundWorker in Update zu verwenden, anstatt die myForm-Methode direkt aufzurufen?

Antwort

2

Sie müssen C# GUI auf dem UI-Thread aktualisieren. In dieser Antwort erfahren Sie, wie Sie von einem anderen Thread zum GUI-Thread synchronisieren.

C# Windows Forms Application - Updating GUI from another thread AND class?

Sie können auch die Debug-Adressleiste praktisch, um zu bestimmen, welche finden Thread Sie sich gerade befinden, wenn

in Visual Studio Debuggen

https://blogs.msdn.microsoft.com/davedev/2012/07/18/where-is-the-suspend-resume-and-terminate-toolbar-in-visual-studio-2012-ultimate/