mehrere Threads



  • Hoffentlich ist der Beitrag bei WinAPI richtig, ich starte aber meine Threads mit CreateThread, also nen WinAPI call....

    Viel wichtiger für mich ist jedoch, dass es nicht möglich ist, eine Thread-Funktion als mehrer paralelle threads zu starten. Folgendes Beispiel:

    // copy files
    	while( pThis->DataMigThreads.finished == FALSE ) {
    
    		if(pThis->DataMigThreads.t_num < 3) {
    
    			// we'll start another one
    			++pThis->DataMigThreads.t_num;
    
    			// prepare parameter
    			thread_data.this_pointer = vparam;
    			thread_data.t_id = pThis->DataMigThreads.t_num;
    
    			// create thread
    			CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)DoCapture,(LPVOID)&thread_data,0,&t_id);
    		}
    	}
    

    Das wird alles innerhalb eines Threads gestartet. Ziel ist es, dass 3 threads gestartet werden, die dann parallel arbeiten.

    Leider rennt aber immer nur der letzte Thread (thread_data.t_id == 3) durch, die anderen machen nichts.
    Offensichtlich habe ich da was im Zusammenhang mit Threads nicht ganz verstanden, würde aber jetzt gerne wissen, wie ich das trotzdem realisieren kann....



  • 1.) Normalerweise nie CreateThread sondern _beginthread(ex)
    2.) Manipulierst du direkt an den Daten, die du an den Thread (per Pointer) übergeben hast



  • flenders schrieb:

    1.) Normalerweise nie CreateThread sondern _beginthread(ex)

    OK, hab ich mir noch nicht angeschaut, verstehe auch nicht warum es überhaupt 2 Möglichkeiten gibt, aber da ich das schon öfters gehört habe, werde ich es auf _beginthread ändern...

    flenders schrieb:

    2.) Manipulierst du direkt an den Daten, die du an den Thread (per Pointer) übergeben hast

    Indirekt ja:

    thread_data.this_pointer = vparam;
    

    vparam is der Parameter den dieser Thread bekommt und ist im Originalen ein this-pointer. Ich verwende den this_pointer, um z.B. eine SendDlgItemMessage-Funktion aufzurufen.

    Zur genauen Erklärung:

    Ich habe einen Dialog names CDataMigDlg, der von CDialog kommt. Wenn der OK-Button gedrückt wird, startet ein Thread, damit der Dialog nach wie vor auf WM_* reagieren kann. Dieser gestartete Thread bekommt den Zeiger auf CDataMigDlg per vparam überliefert und gibt ihn dann an die 3 neuen Threads (die z.B. einen ProgressBar aktualisieren) als member vom thread_data struct weiter (siehe Code-Snap)...
    Zusätzlich für den Thread interessant, ist seine ID, die als t_id member des thread_data structs übergeben wird...



  • Du hast das grundsätzliche Problem nicht verstanden. Es geht darum, dass du n-mal CreateThread aufgerufen hast, bevor der erste Thread überhaupt dazu kommt, über den übergebenen Zeiger den Wert von t_num abzufragen.

    Du musst für jeden Thread eine neue Instanz der thread_data-Klasse anlegen und füllen. Der Thread kann sie dann, wenn er sie nicht mehr braucht, löschen.



  • MFK schrieb:

    Du hast das grundsätzliche Problem nicht verstanden. Es geht darum, dass du n-mal CreateThread aufgerufen hast, bevor der erste Thread überhaupt dazu kommt, über den übergebenen Zeiger den Wert von t_num abzufragen.

    Du musst für jeden Thread eine neue Instanz der thread_data-Klasse anlegen und füllen. Der Thread kann sie dann, wenn er sie nicht mehr braucht, löschen.

    Danke! ich hab übersehen, dass ich ja den Pointer übergebe und nicht thread_data. Werds morgen früh gleich testen, danke für die Replies auf jeden Fall!



  • Sneaker schrieb:

    verstehe auch nicht warum es überhaupt 2 Möglichkeiten gibt,

    Es gibt keine zwei Möglichkeiten. Unter Windows gibt es nur die Möglichkeit mit CreateThread einen Thread zu erzeugen. _beginthred8ex) ist nur ein Sprach spezifischer Wrapper fdafür, um den Heap etc threadsafe zu machen.



  • Luckie schrieb:

    , um den Heap etc threadsafe zu machen.

    Der Heap ist sowieso Threadsafe, wenn Du gegen die Multithread-Libraries linkst. Es geht vielmehr um die Funktionen, die Ihren Status über den Aufruf hinaus bewahren müssen und threadlokale Variablen (z.B. errno und was weiß ich).



  • Nun ja, mit C/C++ kenne ich mich nicht so aus. Bei Delphi ist es aber so.


Anmelden zum Antworten