problem beim schliessen des programm
-
private void SetRecieveText(string text, TextBox target) { reading = true; if (target.InvokeRequired) { SetTextCallback callback = new SetTextCallback(this.SetRecieveText); if (closed || target.Disposing || target.IsDisposed) return; target.Invoke(callback, new object[] { text , target}); // <--- da hängts } else if (!closed) { target.Text = text; } reading = false; }
immer wenn ich das programm schliessen möchte, bleibt er hängen (die methode wird sehr schnell hinterinander aufgerufen)
ich rufe die methode in einem datareceived event eines serialport auf
im formclosing event des hauptfenster rufe ich serialport.close() auf
-
Du weist, daß das übergebene Delegate bei Invoke erst vom Hauptthread deiner Applikation abgearbeitet wird???
Und du hast einige weitere Unschönheiten in deinem Code:
if (closed || target.Disposing || target.IsDisposed) return;
Durch das 'return' setzt du die Variable 'reading' nicht mehr zurück und den Callback solltest du nur erzeugen, wenn er auch den Invoke aufrufen soll,
d.h.if (!(closed || target.Disposing || target.IsDisposed)) { SetTextCallback callback = new SetTextCallback(this.SetReceiveText); target.Invoke(callback, new object[] { text , target}); }
es heißt "SetReceiveText" im englischen.
Rufst du eigentlich mit Invoke die eigene Methode rekursiv auf???
Du solltest also noch mal dein Design überarbeiten...
-
die if zeile hab ich nur aus verzweiflung eingefügt (war grad am experimentieren),
aber hast du eventuell eine elegantere lösung wie ich die daten aus dem serial port über das data received event in ein textfeld bekomme ohne mir beim schliessen die arme auskugeln zu müssenEDIT:
wenn mir die ideen ausgehn studier ich die hilfe, hilft die mir nicht weiter, "frickel" ich halt rum .... by the way die variable reading benutz ich gar net mehr :pdas problem was ich habe ist ja eigentlich nur das der hauptthread stehenbleibt, iss mir klar aber was kann ich tun damit ich just in dem moment wo ich das invoke ausführe nicht gerade das x drücke oder umgekehrt
-
Die If Zeile ist absoluter Schwachsinn! Sie kommt viel zu früh oder zu spät - je nachdem wie weit der GUI Thread ist. Du fragst hier Dinge ab die im GUI Thread gesteuert werden, wobei Du nicht wissen kannst wann sie ihren Wert ändern, eben weil die beiden Threads nicht synchron arbeiten. Wenn Du schon eine Weile entwickelst sollte Dir diese Problematik bekannt sein!!
Wenn Du das Ganze schon so besch...eiden machen willst, dann synchronisiere die Threads mit Thread.join. Aber wie mein Vorposter schon sagt, das ist absoluter Müll.
Th schrieb:
Rufst du eigentlich mit Invoke die eigene Methode rekursiv auf???
Du solltest also noch mal dein Design überarbeiten...Ja tut er. Das ist hier aber völlig legitim (wird standardmässig auch immer so gemacht), denn mehr als eine Rekursion ist hier nicht möglich.
Sebo
-
wie ich bereits erwähnt hab, wenn nich hier dann woanders, ich versteh die mechanismen in c# noch nicht so ganz, und diese zeile entstand aus purer verzweiflung, könntet ihr bitte aufhören meinen code zu bewerten und mal hilfreiche antworten zu verfassen ?
es nervt echt wenn man ein problem hat und nur "dumme" kommentare erntet statt ner antwort .... ich sollte dringen nen kaffee trinken, ich spüre schon wieder aggressionen aufsteigen -.-
ich habe woanders schonmal gefragt ob man das nicht eleganter lösen kann, weil ich mich mit c# noch net so gut auskenne .... danke für den hinweis mit thread.join ich werd mich mal damit befassen .... zu dem design der methode ich hab im internet gesucht und befand diese lösung für brauchbar aber sie hat schwächen wie ich feststellen muss
Meine konkrete Frage jetzt, wie kann ich abfangen das das X gedrückt wird und effektiv den serial port beenden ohne das ich mit dem invoke kollidiere.
-
Die grundsätzliche Invoke-Technik haste richtig umgesetzt, daran ist nichts auszusetzen.
Ich denke nicht, dass Dir allein das Verständnis an der Sprache C# fehlt. Dir fehlt Wissen im Bereich OOP, Threading, etc. In C++ kann man OOP (teilweise) umgehen, .NET ist aber rein OOP, man kommt nicht dran vorbei, genau das scheint Dein Problem zu sein.
-
ja aber trotzdem ist mir unklar wie ich beim klicken auf das X effektiv den serialport zum schweigen bringen kann, ohne das mir das invoke dazwischen funkt, es muss doch eine praktikablere lösung geben als ein "com close" button vorher drücke zu müssen ... (von der usability her kann ich ja nicht vom andwender verlangen JEDEN threaded Vorgang vvon hand zu beenden bevor er auf das x drücken darf)
andere frage, wenn ich das beenden auf einen button lege bewegt sich der button doch ebenfalls im hauptthread, dann müsste das invoke ja ebenfalls so lange hängen bis ich die onclick beendet habe ... dann dürfte soch genau dasselbe problem entstehen wie beim x-drücken ... also ich empfinde den invoke als immer unpraktibkabler ... aber was besseres finde ich einfach nicht, bitte gebt mir noch ne alternative