Frage zu Threads



  • Hi Leutz.
    Wie ist es möglich mehrere Threads unabhängig voneinander laufen zu lassen? Bei mir läuft immer nur ein Thread, und der andere macht gar nichts. Wie geht das anders?

    Mfg Ominion

    EDIT: Ich rufe die Threads so auf:

    ...
    HANDLE hThread;
    HANDLE hThreadTime;
    DWORD dwThreadID;
    DWORD dwThreadID2;
    ...
    hThread = CreateThread (NULL, 0, FirstThread, (LPVOID)0, 0, &dwThreadID);
    hThreadTime = CreateThread (NULL, 0, TimeThread, (LPVOID)0, 0, &dwThreadID2);
    

    Und so sehen die Threads aus:

    DWORD WINAPI FirstThread (LPVOID data)
    {
    ...
    	return ((DWORD)data);
    }
    DWORD WINAPI TimeThread (LPVOID data)
    {
    ...
    	return ((DWORD)data);
    }
    


  • Ominion schrieb:

    Bei mir läuft immer nur ein Thread, und der andere macht gar nichts.

    😃 LOL 😃

    Hört sich witzig an, der eine läuft, der andere macht gar nichts...

    Naja, der Code sieht ganz in Ordnung aus, sollte so OK sein 👍
    Mal ein wenig Ursachenforschung: Wie wirkt sich das aus, das der eine "nichts macht"? Mach doch mal ein wenig Tests mit den Threads, lass sie also beide irgendwas ausgeben (ohne deinen anderen Code). Dann siehst du ja, ob sie beide laufen, wie sie sollen.
    So z.B.

    DWORD WINAPI FirstThread (LPVOID data)
    {
        for ( ULONG i=0; i<20; i++ )
        {
            printf( "Thread 1... %i\n", i );
            Sleep( 500 );
        }
        return ((DWORD)data);
    }
    DWORD WINAPI TimeThread (LPVOID data)
    {
        Sleep( 250 );
        for ( ULONG i=0; i<20; i++ )
        {
            printf( "Thread 2... %i\n", i );
            Sleep( 500 );
        }
        return ((DWORD)data);
    }
    

    Generell denke ich, dass der Fehler in deinem Code in den Threads liegt (bzw. in dem einen, der nichts tut.
    Erstatte mal Bericht von dem Code, denn das drumherum ist definitiv OK!



  • Hm hast du gegen die Multithreading-Libraries gelinkt ?



  • Die Bibliotheken sind gelinkt.

    Also der erste Thread funktioniert, der wartet auf eine eingehende Verbindung. Der zweite soll eigentlich die Uhrzeit ausgeben:

    DWORD WINAPI TimeThread (LPVOID data)
    {
        Timer (hTime);
        return ((DWORD)data);
    }
    

    Die Funktion sieht so aus:

    void Timer (HWND hWnd)
    {
    	#define NUM_ELEMENTS(x) (sizeof((x)) / sizeof((x)[0]))
    
    	SYSTEMTIME st;
    	TCHAR szTime[32];
    
    	GetLocalTime (&st);
    
    	GetTimeFormat (LOCALE_USER_DEFAULT, LOCALE_USE_CP_ACP, &st, NULL, szTime, NUM_ELEMENTS(szTime));
    	SetWindowText (hWnd, (LPCSTR) szTime);
    }
    

    Mfg Ominion



  • Schätze, dass er den Window-Text nicht setzt. Überprüf doch mal den Rückgabewert von SetWindowText. Und wieso baruchst du einen extra Thread, nur um einmal die Uhrzeit im Fenster anzuzeigen? Oder soll die Zeit ständig angezeigt werden? Dann bräuchtest du ja eine Schleife!
    So beendet sich der Thread ja direkt nach dem setzen der aktuellen Uhrzeit.



  • Bist du dir sicher das der handle stimmt?



  • Ja ich will die Uhrzeit immer akutalisieren...das funktioniert jetzt auch, allerdings flackert das immer. Wie kann ich das ändern?

    Mfg Ominion

    EDIT: ja



  • versuch es mit einem Sleep(100) in deinem thread



  • auch schon gemacht, bringt leider nichts



  • Ominion schrieb:

    auch schon gemacht, bringt leider nichts

    Dann versuchs mit nem höheren Wert für Sleep.

    Sonst bleibt dir nur noch n Subclassing für die Titelleiste übrig, bei dem du dafür sorgst, dass bspw. bei einem eingehenden WM_EREASEBKGND ein return (1L) 'ausgeführt' wird. Oder du nutzt ein ganz anderes Ausgabe-Ziel.

    Mal ne Frage: Warum lößt du die Sache eigentlich in nem Thread ? Für ne Zeitaktualisierung reicht auch n Low-Level-Timer.



  • mit Timern habe ich noch nicht gearbeitet, deshalb... jetzt funktioniert es, allerdings bleibt der timer manchmal stehen, weil er zu schnell ist...liegt das am Betriebssytem?



  • Ominion schrieb:

    mit Timern habe ich noch nicht gearbeitet, deshalb... jetzt funktioniert es, allerdings bleibt der timer manchmal stehen, weil er zu schnell ist...liegt das am Betriebssytem?

    Hä? ist das nicht n Widerspruch ? Du hast noch nit mit Timern gearbeitet und jetzt bleibt n Timer auf einmal stehen ?! Huh ?! 😮

    Man kann die 'Geschwindigkeit', genauer die Intervalle von Timer doch festlegen 😉 .



  • ne sry ich meinte die uhr...die bleibt manchmal stehen



  • Ominion schrieb:

    ne sry ich meinte die uhr...die bleibt manchmal stehen

    Hm was heißt n 'manchmal'; also wann genau ? Gibts da Regelmäßigkeiten ?

    Also ich würd dir nen simplen Timer empfehlen alá:

    // in deiner WndProc:
    case WM_CREATE:
      SetTimer(hWnd, 500, 500, NULL);
    
    // ...
    
    case WM_TIMER:
      // Aktualisierung der Uhrzeit
    
    case WM_DESTROY:
      KillTimer(hWnd, 500);
    


  • nein es gibt keine regelmäßigkeiten, je nachdem wie schnell die uhr zu schnell ist...



  • Ominion schrieb:

    je nachdem wie schnell die uhr zu schnell ist...

    Die Uhr sollte ja eigentlich nicht "zu schnell" sein! Haste den Timer so integriert, wie CodeFinder es gepostet hat? Sonst poste mal ein paar Codeauszüge.



  • Nein, ich rede immer noch von der alten "Version", also mit dem Thread. Aber ich werde das mal machen



  • Ominion schrieb:

    Nein, ich rede immer noch von der alten "Version", also mit dem Thread. Aber ich werde das mal machen

    lol, aber du liest dir meine Posts schon durch oder ? 🙄



  • Nö, ich überlese die ganz dezent 😉
    Kleiner Spaß. Doch aber meistens will ich erstmal das probieren, was ich selber angefangen habe...also mit dem Timer( ⚠ ) funktioniert das wunderbar.


Anmelden zum Antworten