Multithreading



  • Hi Folks.

    Ich habe ein Programm und will es nun um ein wichtiges Feature erweitern. Ich beschreibe es erst mal.

    Angenommen, ich habe einen normalen Dialog mit Steuerelementen hinter denen mein Code steht. Wenn der Anwender innerhalb des Programms zu diesem Dialog kommt, kann er normal per Tastatur und Maus mit dem Programm kommunizieren und es steuern. So weit so gut, alles ganz normal.

    Nun soll aber, während der Dialog aktiv ist, der COM1-Port abgehört werden, bis dieser Daten schickt. Am COM1-Port befindet sich ein Meßinstrument, das der User bedienen kann und welches dann Daten an das Programm schicken soll.

    Das Problem ist nun, das der Dialog weiterlaufen soll. Der User soll weiterhin normal so wie bisher arbeiten können, aber gleichzeitig soll der COM-Port abgehört werden. Bei einer Eingabe am Meßinstrument soll das Programm die gesendeten Daten verarbeiten und dann wieder Interaktionen im Dialog erlauben.

    Eine einfache Endlos-while-Schleife, die den COM-Port abhört bringt hier ja nichts, da man dann wohl nicht mit dem Dialog auf herkömmliche Weise interagieren kann.

    Ich dachte an einen zusätzlichen Thread der den COM-Port abhört und bei Datenfluß den normalen Programmablauf unterbricht, das Programm die Daten auswertet und dann wieder in den normalen Modus zurückkehrt und den Thread wieder in den Listening-Modus (COM1) versetzt.

    Die Frage ist, geht es so und wenn ja wie (ein einfaches und kurzes Codebeispiel wäre sehr hilfreich). Oder geht es sogar einfacher (auch hier wäre ein wenig Code sehr nett).

    Vielen Dank an alle die sich die Mühe machen diesen (viel zu langen Beitrag) zu lesen 🙂



  • Es gibt nix einfacheres 😃

    (angenommen deine Dialogklasse heißt CMyDlg):

    UINT MeineSuperGenialeTolleMegaSuperDuperKrasseThreadFunktion( LPVOID pParam )
    {
      CMyDlg* pDlg = (CMyDlg*) pParam;
      // hier kannst du deinen Com-Code plazieren
      // ich habe der Threadfunktion extra noch nen Zeiger auf deine Dialogklasse gegeben, damit du von dieser Funktion aus auch auf den Dialog zugreifen kannst
    }
    

    irgendwo dann (z.B. in InitDialog oder OnButton1 😃 )

    AfxBeginThread( MeineSuperGenialeTolleMegaSuperDuperKrasseThreadFunktion, this);
    

    Grüße Rapha


Anmelden zum Antworten