Probleme mit Thread



  • Hey Leute

    hätte da ein Problem für euch.

    Programmiere schon seit längerem an einer kleinen Forms-Anwendung, komm aber jetzt an einer Stelle nicht weiter.

    1. Habe ein Form1 in dem bekomme ich Daten vom Serialport (mit einem DataRecievedEventHandler) Diese Date kommen von einem RFID Modul.

    Sobald ich also neue Daten Empfange rufe ich ein anderes Form auf, das mir die Daten anzeigt! Zu diesen Daten möchte ich nun ein Bild in einer Picturebox laden
    können, doch sobald ich einen OpenFileDialog öffnen möchte ,bekomme ich folgende Ausname die ich nicht so wirklich verstehe:

    **************************************************************
    Eine nicht behandelte Ausnahme des Typs "System.Threading.ThreadStateException" ist in System.Windows.Forms.dll aufgetreten.

    Zusätzliche Informationen: Für den aktuellen Thread muss der STA-Modus (Single Thread Apartment) festgelegt werden, bevor OLE-Aufrufe ausgeführt werden können. Stellen Sie sicher, dass die Hauptfunktion mit STAThreadAttribute gekennzeichnet ist. Diese Ausnahme wird nur ausgelöst, wenn ein Debugger mit dem Prozess verbunden ist.

    ****************************************************************

    Danke schon mal für eventuelle Tipps



  • Ist der Debugger mit dem Prozess verbunden ?



  • Ja , wenn ich die exe selbst ausführe kommt es zu keinem Fehler,
    aber das Form aus dem ich den OpenFileDialog aufrufe, geht einfach zu!?



  • [STAThread]
    int main(array<System::String ^> ^args)
    

    Schau mal ob das Attribut am Startpunkt der Anwendung angegeben ist.



  • [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    

    Steht da bei mir , hab aber das "Attribute" auch schon mal gelöscht ,
    des macht keine Unterschied.



  • Du bist vermutlich in der Callback (wenn Du die Daten bekommst) in einem anderen Thread!

    The DataReceived event is raised on a secondary thread when data is received from the SerialPort object. Because this event is raised on a secondary thread, and not the main thread, attempting to modify some elements in the main thread, such as UI elements, could raise a threading exception. If it is necessary to modify elements in the main Form or Control, post change requests back using Invoke, which will do the work on the proper thread.

    Also, verwende this.Invoke oder this.BeginInvoke um in den "richtigen" Thread reinzurufen und dann die Dinge dort zu tun!



  • Verstehe ich nicht ganz

    Mein Form1 läuft in nem Thread!
    Das SerialPort_Data_Recieved Ereignis in nem eigenen, wenn man das so sagen kann !

    aber von hier aus , also wenn ich Daten bekomme die einer bestimmten Formatierung entsprechen, starte ich selbst eine zweite Form (NeuerFahrer)
    also:

    Projekt_2008::NeuerFahrer^ neuerfahrer = gcnew Projekt_2008::NeuerFahrer();
    neuerfahrer->ShowDialog();
    

    müsste doch auch wieder ein eigener Thread sein oder ?
    Auf jeden Fall hat der Anwender hier die Möglichkeit einen Button zu drücken
    um einen FileOpenDialog zu öffnen!(um nen Bildpfad auszuwählen)

    OpenFileDialog^ dlg = gcnew OpenFileDialog();
    	dlg->ShowDialog();
    

    genau hierbei wird mir die Exception geworfen!
    Wie soll denn des hier funktionieren mit dem Invoke ?
    Hat doch nichts mit nem Treadübergreifenden Vorgang zu tun oder ?



  • Den Fehler habe ich auch schon mal bekommen, konnte mir aber nicht erklären warum. Ich habe im Thread, der den Fehler auslöst

    thread->ApartmentState = ApartmentState::STA;
    

    gesetzt und der Fehler verschwand.

    Vielleicht probierst Du es mal damit.



  • Danken das hab ich schon, aber das wars leider nicht !Mein Problem ist auch, wenn ihr mir das imm Debugger anschaue, dann sind da ca. 10 Treads offen, und ich glaube das nicht der aktuelle Thread das Problem darstellt.

    Aber genau weis ich das leider nicht !

    Danke trotzdem


Anmelden zum Antworten