Fehler beim öffnen der seriellen Schnittstelle



  • Oh oh da habt Ihr Recht.

    Aber gibts denn eine Methode die laufende Threads des Programms aus abfragen kann ohne externe Programme wie z.B. den Prozessexplorer zu verwenden ?



  • Ja, GetExitCodeThread()

    @junix
    Dieses Flag sollte man aber dann irgendwie in eine CriticalSection o.ä. packen, oder?



  • wieso in eine CriticalSection dieses Flag rettet nur im Falle der Terminierung des Threads den Zustand also ob der Thread erfolgreich oder nicht erfolgreich beendet wurde mehr macht diese Funktion doch nicht.

    Ich finde sogar was oft in Vergessenheit gerät weil man schneller programmieren will sollte man generell bei mehreren Threads Prioritäten vergeben und Isollieren d.h. wie z.B. CriticalSection aber den Thread an sich nicht den Zusatand des Flags oder ?



  • Mmh, also ich dachte das wär so:

    Im Thread befindet sich irgendwo die Zeile:

    if ( flagShutdown )
    {
     //Thread beenden
    }
    

    So. Und wenn jetzt irgendwo im Programm dieses Flag auf true gesetzt wird,
    während der Thread gerade die Zeile if( flagShutdown ) liest, dann ist das doch nicht ynchronisiert oder hab ich da was falsch verstanden? 😕



  • Cosmixx schrieb:

    Dieses Flag sollte man aber dann irgendwie in eine CriticalSection o.ä. packen, oder?

    Wenn mans wirklich sauber machen will, dann sollte man in der Tat über eine Zugriffsfunktion welche das Flag in einer Thread-Sicheren umgebung abfragt gehen. Der (Prozessor-)Zeitverlust ist meines Erachtens minimal. Wobei das Terminate-Flag in sofern eigentlich nicht weiter Thread-Kritisch sein muss.

    Ich hab z.B. immer eine Zugriffsfunktion "Terminate" welche das Flag auf true setzt. Alle anderen lesen nur davon... Theoretisch sollte eigentlich da nix passieren, wenn man den lesenden Zugriff nicht in eine Critical Section passt. Allerdings muss man das natürlich von implementation zu implementation entscheiden... Ich hab mir z.B. eine CThread-Klasse gebaut, welche keine Critical-Sections nutzt. Aus oben genannten Gründen.

    Das schlimmste was passieren kann, ist das der Thread in der Schleife einmal mehr durchläuft als eigentlich nötig. Wie gesagt. Der Programmierer muss hier klar abschätzen.

    Für die "Sending kill signal"-Phase welche man dann ja mit TerminateThread implementiert, ist das Alles sowieso wieder eher nichtig.

    -junix



  • Das man in der Schleife den Thread mit einem Flag auf true setzen beendet ist logisch, ich meinte aber angenommen ich starte einen Thread der etwas abarbeitet und dann beendet werden soll ohne überhaupt nur eine Schleife zu durchlaufen, wie beende ich dann den Thread oder brauche ich das nicht killt Windows dem Thread nach einer Timeoutzeit von alleine ? Was muss ich aber machen wenn ich ihn vorher beenden will und nicht auf Windows warten möchte ?



  • Cosmixx schrieb:

    Mmh, also ich dachte das wär so:

    Im Thread befindet sich irgendwo die Zeile:

    if ( flagShutdown )
    {
     //Thread beenden
    }
    

    Naja würde ich nicht unbedingt sagen. Meistens läuft ein Thread ja mehrere Male durch seine Aufgaben. also sähe es eher so aus:

    //-- Setup code
    while (!flagShutdown)
    {
        //-- Working code
    }
    //-- Cleanup code
    
    return result_int
    

    Sollte es nun passieren, dass der Thread in sich wieder Aufgaben erledigt, die schleifen enthalten, gilt natürlich das Selbe. Wenn einfach eine "längere" Sequenz innerhalb der Schleife steckt, dann kanns allerdings vorkommen, dass (zumindest ich mach das so) noch ein paar extra if-abfragen gesetzt werden... das kommt bei mir allerdings selten vor, weil ich meistens noch Progressbars aktualisieren möchte, etc. Und dafür kann ich sowieso keine längeren Rechnungen als ca. 0.5s am Stück brauchen.

    -junix



  • mike2003 schrieb:

    [...]ich meinte aber angenommen ich starte einen Thread der etwas abarbeitet und dann beendet werden soll ohne überhaupt nur eine Schleife zu durchlaufen, wie beende ich dann den Thread [...]

    ... dann wäre cosmixx Ansatz wieder der richtige... Nach Teilaufgaben prüfst du, ob der Thread wohl beendet werden soll oder nicht. (würde ich zumindest so machen) Da du ja vermutlich abschätzen kannst wie lange die Teilabschnitte deines Codes dauern, kannst du die ifs in einer passablen reaktionszeit setzen.



  • @junix

    Ja, na klar 🙄
    Das Flag muss normalerweise in die while-Schleife.



  • danke !!!

    werde es mal so probieren wie Cosmixx 🙂

    Aber das mit dem GetLastError von vorhin das ist mir noch nicht 100% sicher naja mal schauen

    Gruss


Anmelden zum Antworten