Threadstart in OnInitDialog



  • Hallo,

    in OnInitDialog starte ich mit AfxBeginThread einen Thread und rufe in der nächsten Zeile eine Funktion auf, die auf das korrekte Arbeiten des Threads angewiesen ist.

    Nun habe ich das Problem daß der Thread offenbar nicht startet. Dieser soll periodisch Prozeßdaten einlesen, welche in der Funktion gebraucht werden.

    Erst wenn OnInitDialog komplett beendet wird, funktioniert alles aber dann ist es "zu spät".

    Hat jemand eine Idee wie man das korrigiert?



  • Das musst Du Synchronisieren! Du musst ein Sync-Objekt verwenden (CEvent) und nach dem Thread-STart darauf warten. Im Thread musst Du das Sync-Objekt signalisieren, wenn Du bereit bist für Aufgaben...



  • Hi,

    mir gehts eher darum ob ein gestarteter Thread innerhalb der OnInitDialog Funktion überhaupt korrekt laufen kann solange noch OID abgearbeitet wird.


  • Mod

    Was hat der Thread bitte mit dem Dialog zu tun? Eigentlich nichts... oder?
    Was befürchtest Du?



  • Hi,

    also:

    CMyApp::OnInitDialog
    {
    AfxBeginThread(BlaThread,...);
    Sleep(10000);
    Call FuncA();
    }
    
    UINT CMyApp::BlaThread(...)
    {
    Call FuncB
    }
    

    In FuncB ist nun ein Haltepunkt welcher nicht angesprungen wird. Dieser sollte aber während des Sleep(10000) Befehls angesprungen werden.
    Erst wenn OID zuende ist und das Dialogfenster sichtbar ist wird am Haltepunkt gestoppt.
    Deshalb behaupte ich mal daß Threads während OID läuft nicht korrekt abgearbeitet werden.
    Wo liegt hier der Fehler?



  • Da musst Du dich verschaut haben...


  • Mod

    Sollte FuncB mit irgend einem Windows Control Deines Dialoges etwas machen, dann hast Du das typische Problem eine Synchronistion über die Windows Message-Loop.

    Du solltest Dir mal klar werden was bei mehreren Thredas mit Fenstern passiert und was passiert wenn man SendMessage an ein Fenster eines anderen Threads sendet.



  • Moin,

    also ich habe mal meine Routine als eigenen Thread gemacht und diesen mit SetEvent in OnInitDialog gestartet:

    m_pEventThreadOIDStart.SetEvent();
    WaitForSingleObject (m_pEventThreadOIDDone.m_hObject, INFINITE);
    

    Thread:

    WaitForSingleObject (m_pEventThreadOIDStart.m_hObject, INFINITE);
    // Do Thread Stuff
    m_pEventThreadOIDDone.SetEvent();
    

    Das funktioniert mal soweit so gut.

    Leider mußte ich feststellen daß SendMessage ein LockUp produziert (wie vorausgesagt wurde).
    Gibts denn keine Möglichkeit dies zu vermeiden?
    Eine Textaktualisierung während des Threads wäre mir schon wichtig.


  • Mod

    Dann musst Du das asynchron machen...

    PostMessage verwenden um dem Dialog-Window etwas mitzuteilen.
    ABER!!! Dann muss das Fensterauch Nachrichten über eine MessageQuee empfangen können und dasgeht nicht während einem WaitFor...


Anmelden zum Antworten