Mehrere Threads mit gleicher ThreadProc



  • Hi,
    ich möchte gerne Threads erstellen, die alle dieselbe Thread-Funktion haben, also die Adresse, die in CreateThread() im 3. Parameter übergeben wird. Ist das so einfach möglich, oder muss ich da was beachten? Ich stell mich da ein wenig an, weil man ja mit Adressen und Threads etwas aufpassen sollte.

    [EDIT]
    Ich hab da noch was gefunden. In meiner BCB-Hilfe steht:

    Alle Multi-Thread-Programme unter Windows NT müssen _beginthreadNT oder die Funktion _beginthread anstelle der API-Funktion des Betriebssystems zur Erzeugung des Thread verwenden, da diese Funktionen eine Initialisierung ausführen, die für ein korrektes Arbeiten der Laufzeitbibliotheksfunktionen erforderlich sind. Die Funktion _beginthreadNT bietet Unterstützung für die Betriebssystemsicherheit. Diese Funktionen sind nur in den Multithread-Bibliotheken verfügbar.

    Stimmt das? Soll ich also nicht CreateThread() verwenden? 😕 Wozu dann diese API-Funktion? Fragen über Fragen... Ich hoffe, ihr könnt mir antworten.
    [/EDIT]
    [EDIT]
    Überschrift geändert
    [/EDIT]

    [ Dieser Beitrag wurde am 26.03.2003 um 04:02 Uhr von WebFritzi editiert. ]

    [ Dieser Beitrag wurde am 30.03.2003 um 04:02 Uhr von WebFritzi editiert. ]



  • Wenn es da so steht. Warum sollten die von Borland dich anlügen? 😕

    Na die APi-Funktion wird wohl den Thread erzeugen. Nur die RTL vom Builder braucht eben noch ein paar Initialisationen. Und wenn sie damit fertig ist, wird sie eben die API CreateThread aufrufen. Irgendwann muß ja ein API-Call kommen. 😉

    [ Dieser Beitrag wurde am 26.03.2003 um 04:08 Uhr von Luckie editiert. ]



  • Das ist richtig. Hab ich jetzt nach einigem Durchstöbern mit der Suchfunktion auch rausgefunden. 🙄
    Es bleibt meine erste Frage.



  • Es ist also wirklich unbedenklich, wenn ich mehere Threads über ein und dieselbe ThreadProc laufen lasse, ja???



  • Ja natürlich. Völlig unbedenklich.



  • @WebFritzi

    Beim BCB gibt's doch 'nen TThread!

    Davon kannste eine eigene Klasse ableiten von der beliebig viele Instanzen erzeugt werden koennen.

    Ich mach das mit 'ner Datei- Suchfunktion. Die kann 'parallel' mehrere Suchen ausführen.

    !!! Du darfst aus dem Thread blos nicht auf alle VCL- Komponenten zugreifen - nur mit Synchronize();

    Oder hat Dein BCB 3 kein TThread, dann vergiss was ich sagte. 😉



  • Es ist also wirklich unbedenklich, wenn ich mehere Threads über ein und dieselbe ThreadProc laufen lasse, ja???

    Es ist genau dann unbedenklich, wenn alle Variablen, auf die von Threads zugegriffen wird, entweder im TLS (Thread local storage) liegen, eine Sychronisation des Zugriffs auf die Variable erfolgt, oder von der Variable einfach nur gelesen wird.



  • @Der Altenburger: Danke, aber TThread kenne ich schon lange. Wir sind hier im WinAPI-Forum. Schon vergessen? 😉

    @RenéG: Danke für deine Antwort. Ich weiß nicht, wie ich Variablen in den TLS bekomme. Meine Variablen befinden sich auf zweierlei Ebenen. Es gibt welche, die lokal in der ThreadProc angelegt werden (Stack). Liegen die dann im TLS? Andere Variablen hab ich auf dem Heap angelegt, allerdings nicht in der ThreadProc. Der ThreadProc wird ein Pointer mitgegeben, der auf eine Instanz meiner Thread-Klasse zeigt, die im Hauptthread angelegt wurde. In dieser Klasse befinden sich 3 Members vom Typ WCHAR* (auch auf dem Heap angelegt). Auf die greife ich in der ThreadProc zu. Ist mir das erlaubt?



  • @WebFritzi

    Ich hab da noch was gefunden. In meiner BCB-Hilfe steht:
    *

    Dann solltest Du nicht so betonen, dass Du mit BCB arbeitest! 🙂 Die Initialisierungs- Probleme kommen auch von BCB- Laufzeitbibliotheken. 😕

    PS: Halt mich raus!

    [ Dieser Beitrag wurde am 27.03.2003 um 18:21 Uhr von DerAltenburger editiert. ]



  • Original erstellt von DerAltenburger:
    Dann solltest Du nicht so betonen, dass Du mit BCB arbeitest! 🙂 Die Initialisierungs- Probleme kommen auch von BCB- Laufzeitbibliotheken.

    Du solltest mich langsam gut genug kennen und wissen, dass ich mich im BCB recht gut auskenne, dass ich also TThread kennen muss. Aber du hast recht... man weiß ja nie. 😉 Die Initialisierungs"probleme" haben übrigens nichts mit dem BCB zu tun.



  • Original erstellt von WebFritzi:
    Es gibt welche, die lokal in der ThreadProc angelegt werden (Stack). Liegen die dann im TLS?

    Jeder Thread hat seinen eigenen Stack.

    Andere Variablen hab ich auf dem Heap angelegt, allerdings nicht in der ThreadProc. Der ThreadProc wird ein Pointer mitgegeben, der auf eine Instanz meiner Thread-Klasse zeigt, die im Hauptthread angelegt wurde. In dieser Klasse befinden sich 3 Members vom Typ WCHAR* (auch auf dem Heap angelegt). Auf die greife ich in der ThreadProc zu. Ist mir das erlaubt?

    Klar, wenn du die Zugriffe synchronisierst. 🙂
    Wenn ein Thread gerade schreibend auf so eine Instanz zugreift, sollten die anderen überhaupt nicht darauf zugreifen können.



  • Original erstellt von cd9000:
    Jeder Thread hat seinen eigenen Stack.

    Ach ne... Ich fragte, ob die auf dem TLS liegen...

    Original erstellt von cd9000:
    Klar, wenn du die Zugriffe synchronisierst. 🙂
    Wenn ein Thread gerade schreibend auf so eine Instanz zugreift, sollten die anderen überhaupt nicht darauf zugreifen können.

    Ah, das ist das mit den Critical Sections, oder? Ich lese aber nur von den Variablen. Daher werde ich sowas wohl nicht benötigen.



  • Ob TLS oder (lokaler) Stack, ist doch wurscht, oder? 🙂



  • Original erstellt von cd9000:
    Ob TLS oder (lokaler) Stack, ist doch wurscht, oder? 🙂

    Ich weiß nicht, denn ich habe keine Ahnung, was der TLS ist...



  • guck doch in die hilfe. das heißt Thread Local Storage



  • Original erstellt von <g>:
    guck doch in die hilfe. das heißt Thread Local Storage

    Wenn du den Thread von vorne gelesen hättest, dann wüsstest du, dass ich das bereits weiß, du Idiot! Ich weiß aber nicht, WAS das ist.



  • Idiot

    DAS WILL ICH ÜBERHÖRT HABEN, DU ****** !! :o



  • P-E-N-N-E-R!!!



  • Hihi, wie schön, dass du dich ärgerst. Das war auch mein Ziel. 😃 :p



  • UND MEIN ZIEL WAR ES DICH ZU ERFREUEN!!! 🙂 🙂 🙂


Log in to reply