Literatur / Tutorials / Skripte zu Threads



  • Hallo liebe Leute!

    Ich wollte mal vorsichtig anfragen, wie man am besten in die Thematik "Threads" einsteigt. D.h. vorallem auch Thread-Synchronisation und Thread-Sicherheit.

    Bücher? Tutorials? Empfehlungen?





  • Nungut, dann muss ich jetzt aber zumindest eine konkrete Frage stellen:

    Angenommen ich habe jetzt eine Windows-Anwendung, die, wenn der User einen bestimmten Menüeintrag anklickt, das Ergebnis einer größeren Berechnung auswerten will / darstellen will. Die "große Berechnung" dauert vermutlich ~10 Sekunden, je nach Rechner eben. In der Zeit soll die Anwendung natürlich nicht still stehen, also starte ich mit CreateThread einen neuen Thread.

    Mein Problem:
    Die Hauptanwendung kann erst weiter machen, wenn der Thread beendet ist! Denn der Thread liefert jetzt irgendwelche Ergebnisse und die Hauptanwendung will sie anzeigen. D.h. ich muss in der Hauptanwendung auf den Thead warten => es steht doch wieder alles still!

    Wie kann man das lösen? Das einzige was mir halbwegs plausibel erscheint, wäre auch die Darstellung dem Thread zu überlassen. Aber das finde ich irgendwie merkwürdig, weil der dann auf Variablen, Objekte, der Hauptanwendung zugreifen müsste. Außerdem bräuchte ich dann eine Art Mutex, denn das Ergebnis der Berechnung hängt von der Usereingabe ab, und die soll ja nicht nochmal verändert werden können. (User gibt Werte ein, lässt sie auswerten... der Thread schreibt die ausgewerteten Ergebnisse in den dafür vorgesehenen Bereich, aber der Benutzer hat schon so weit rumgefuhrwerkt, dass ein bestimmter Bereich jetzt gar nicht mehr existent ist, z.B. (Anzahl der Variablen verändert).

    Wie löst man das im Regelfall?

    Danke!!



  • Du brauchst doch gar nicht aktiv mit dem Fenster-Thread auf den Rechen-Thread warten. Schalte vor dem Starten des Rechen-Threads alle Steuerelemente aus (für Englisch-Fanatiker: disable all(e) controls), lass den Rechen-Thread laufen, während dein Fenster-Thread weiterhin auf Win-Nachrichten wartet. Entweder schickt dein Rechen-Thread wenn er fertig ist eine selbst-definierte Windows-Nachricht (WM_USER+x) an den Fenster-Thread oder setzt ein Event oder was auch immer. Dann schaltet dein Fenster-Thread die Steuerelemente einfach wieder an und fertig ist die Suppe.



  • Hmm, auf diese Weise könnte ich dann ja auch bei Empfang der User-Message mit meiner Darstellung fortfahren... Daten sind jetzt da, Hauptthread kann sie darstellen. Oder wäre es besser, wenn das der Thread zur Berechnung noch mit übernimmt?

    Wenns der Thread zur Berechnung macht, wäre es halt eine Einheit, so verteilt sich das "Geschehen" auf drei Bereiche. Die Auswertung wird an A gestartet, an B berechnet und an C dargestellt. Ansonten wäre B und C halt vereint, aber die Steuerelemente muss ich sowieso wieder aktivieren...

    Ich würde sagen, der Thread sollte sich besser nur auf die Berechnung beschränken / nur der Hauptthread sollte Ausgabe darstellen. Was meinst du dazu?



  • no topic schrieb:

    Ich würde sagen, der Thread sollte sich besser nur auf die Berechnung beschränken / nur der Hauptthread sollte Ausgabe darstellen. Was meinst du dazu?

    Ich sage: perfekt 🙂👍



  • hi,
    hab auch ein ähnliches problem und eine grundsätzliche frage...
    ich möchte verschiedene threads starten, die unterschiedliche funktionen ausführen.

    ist es besser in dem stil:

    DWORD WINAPI ThreadFunc(LPVOID data)
    {
    cout<<"thread "<<(int)data<<" gestartet"<<endl;
    switch((int)data)
    {
    case 0: funktionen 1 ..... break;
    case 1: funktionen 2 ..... break;
    }
    return 0;
    }
    
    for(i=0;i<max_threads;i++)
    hThread[i] = CreateThread(.., ThreadFunc,(LPVOID)i,0,threadid[i]);
    

    oder so?

    DWORD WINAPI ThreadFunc1(LPVOID data)
    {
    fumktionen 1 ..... 
    return 0;
    }
    
    DWORD WINAPI ThreadFunc2(LPVOID data)
    {
    funktionen 2 .....
    return 0;
    }
    
    hThread[0] = CreateThread(...,ThreadFunc1,...);
    hThread[1] = CreateThread(...,ThreadFunc2,...);
    

    wie is es am sinnvollsten? oder hat jmd allgemeine anregeungen zu dem code?

    mfg



  • Naja, ich würde sagen: Kommt drauf an!
    Im dargestellten Fall:

    switch((int)data)
    {
    case 0: funktionen 1 ..... break;
    case 1: funktionen 2 ..... break;
    }
    return 0;
    }
    

    Führst du ja völlig verschiedene Sachen aus, die eigentlich nichts miteinander zu tun haben. Entsprechend würde ich sagen, du machst es lieber wie im zweiten Vorschlag! Anders wäre es, wenn die Threads alle eine ähnliche Aufgabe hätten, z.B. in eine Datei schreiben, auf den Bildschrim schreiben etc... da könntest du dann als Parameter "das Ziel" angeben.


Anmelden zum Antworten