aus Thread Gui aktualisieren



  • Hallo,

    ich wollte mal eben ein Auswertungsprogramm für die serielle Schnittstelle schreiben. Eigentlich erschien mir C++ mit dem Express Studio recht simpel. Doch nun habe ich das Problem das ich meine GUI nicht direkt aktualisieren kann und immer eine Exception erhalte... Habe mich etwas über die 'Delegations' gelesen doch nur Beispiele für C# gefunden. Wie kann man das in C++ erledigen?

    Komme von der Hardwareseite (Assembler, ANSI C, usw) und mich interessiert derzeit nur die Darstellung der seriellen Daten in einer Listbox.. 😉

    Grüße

    Holger



  • Hallo,

    habe nun eine Lösung gefunden. Falls einer vor dem selben Problem steht:

    private: System::Void serialPort1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) {
    				 MyCallback^ callback = gcnew MyCallback(this, &Test_IO_Board::Form1::Func);   
    				 listBox1->Invoke(callback,Convert::ToString(serialPort1->ReadByte()));
    			 }
    
    	//callback function
    	public:	void Func(String^ str) {
    				 this->listBox1->Items->Add(str);
    			 }
    	//delegate declaration
    	delegate void MyCallback(String^ str);
    


  • Du kannst auch "BeginInvoke" verwenden, falls Du keinen Rückgabewert benötigst (dann kehrt die Funktion sofort zurück und wartet nicht bis diese im anderen Thread wirklich ausgeführt wurde).

    Auch kannst Du mit "InvokeRequired" abfragen, ob Du Dich schon im korrekten Kontext befindest...



  • Dumme Zwischenfrage eines nicht .NETlers:
    Muss hier keine CriticalSection o.ä eingesetzt werden, um gleichzeitigen Speicherzugriff auszuschießen?



  • Wer greift denn hier gleichzeitig auf welchen Speicher zu?

    Aus diesem Grunde gibt es doch das "Invoke" / "BeginInvok". Damit verlagert man den Methodenaufruf in den passenden Thread! Somit greift immer nur ein Thread auf die GUI-Daten zu...


Log in to reply