Mehrer Funktionen über eine Threadroutine starten



  • Eine Threadstartroutine z.B:

    bool startThread(DWORD WINAPI threadFunc=0)
    {
    
    	for(int i=0; i < 10; i++)
    	{
    		if(myThreads[i] == GetCurrentProcess())
    		{
    			continue;
    		}
    		pDataArray[i] = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
    			sizeof(MYDATA));
    
    		if( pDataArray[i] == NULL )
    		{
    			// If the array allocation fails, the system is out of memory
    			// so there is no point in trying to print an error message.
    			// Just terminate execution.
    			MessageBox(0,"Nicht genügend Speicher!","Error!",MB_ICONERROR);
    			ExitProcess(2);
    		}
    
    		// Generate unique data for each thread to work with.
    
    		pDataArray[i]->val1 = i;
    		pDataArray[i]->val2 = i+100;
    
    		// Create the thread to begin execution on its own.
    
    		myThreads[i] = CreateThread( 
    			NULL,                                                // default security attributes
    			0,                                                   // use default stack size  
    			(LPTHREAD_START_ROUTINE)threadFunc ,                 // thread function name
    			pDataArray[i],                                       // argument to thread function 
    			0,                                                   // use default creation flags 
    			&dwThreadIdArray[i]);                                // returns the thread identifier 
    		// Check the return value for success.
    		// If CreateThread fails, terminate execution. 
    		// This will automatically clean up threads and memory. 
    
    		if (myThreads[i] == 0) 
    		{
    			ExitProcess(3);
    		}
    
    	} // End of main thread creation loop.
    	return true;
    }
    

    und die Funktionen z.B :

    DWORD WINAPI funktion1(int 1,int 2 );
    DWORD WINAPI funktion2(int 1,int 2 );
    DWORD WINAPI funktion3(int 1,int 2 );
    DWORD WINAPI funktion4(int 1,int 2 );
    usw.
    

    Funktion mit Threadroutine starten z.B:

    startThread(funktion1(a,b,c);
    

    Sollte gehen oder?
    CreateThread will als 3 Parameter lpStartAddress der Funktion.

    Das Problem, wenn ich Debugger springt der Debugger direkt zu Funktion anstatt mir vorher die Threadroutine zu zeigen , damit ichs mir anschauen kann!

    Gruß
    Muhabet



  • hi bruhda!

    die ganzen ExitProcess im code kagga-style sind! 👎

    Muhabet schrieb:

    Funktion mit Threadroutine starten z.B:

    xxx
    

    Sollte gehen oder?

    jepp, geht, aber nicht so.
    wozu willst du eigentlich create thread kapseln?
    angenommen, du hast nen guten grund dafür, dann halte dich aber an die datentypen und mach nicht aus LPTHREAD_START_ROUTINE nen DWORD typ.

    DWORD WINAPI thread_func1 ( PVOID pv )
    {
    	while ( 1 )
    	{
    		puts ( "Hi there from thread_func1" );
    		Sleep ( 1000 );
    	}
    }
    
    DWORD WINAPI thread_func2 ( PVOID pv )
    {
    	while ( 1 )
    	{
    		puts ( "Hi there from thread_func2" );
    		Sleep ( 1000 );	
    	}
    }
    
    int my_thread_starter ( LPTHREAD_START_ROUTINE lpStartAddress )
    {
    	CreateThread ( NULL, 0, lpStartAddress, NULL, 0, NULL );				
    }
    
    int main ( void )
    { 
    	my_thread_starter ( thread_func1 );
    	Sleep ( 500 );
    	my_thread_starter ( thread_func2 );
    	Sleep ( 10000 );
    	return 0;
    }
    

    Muhabet schrieb:

    Funktion mit Threadroutine starten z.B:

    DWORD WINAPI funktion1(int 1,int 2 );
    DWORD WINAPI funktion2(int 1,int 2 );
    DWORD WINAPI funktion3(int 1,int 2 );
    DWORD WINAPI funktion4(int 1,int 2 );
    

    Sooo nicht!
    So das aussehen muss

    DWORD WINAPI MyThreadFunction( LPVOID lpParam );

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms682516(v=vs.85).aspx

    Mit dem Parameter lpParam kannst du alles übergeben, was du willst.
    Sollen mehrere Parameter übergeben werden, kapselst du sie in einer Struktur:
    (Das gilt auch für allokierten Speicher, in so einer Threadstarterfunktion hat
    eine Funktion die Speicher reserviert nichts zu suchen. Statt dessen übergebe lieber Zeiger auf bereits reservierten Speicherplatz.)

    typedef struct tagMyThreadParameters
    {
    	char* demo_output;
    	int thread_number;
    	// ... weitere Daten/Datentypen, was das Herz begehren mag...
    
    } my_thread_parameters;
    
    DWORD WINAPI thread_func1 ( PVOID pv )
    {
    	my_thread_parameters* thread_parameters = pv;
    
    	while ( 1 )
    	{
    		printf ( "Hi there from %s, thead number %d\n", thread_parameters->demo_output, thread_parameters->thread_number );
    		Sleep ( 1000 );
    	}
    }
    
    DWORD WINAPI thread_func2 ( PVOID pv )
    {
    	my_thread_parameters* thread_parameters = pv;
    
    	while ( 1 )
    	{
    		printf ( "Hi there from %s, thead number %d\n", thread_parameters->demo_output, thread_parameters->thread_number );
    		Sleep ( 1000 );
    	}
    }
    
    int my_thread_starter ( LPTHREAD_START_ROUTINE lpStartAddress, my_thread_parameters*  thread_parameters )
    {
    	CreateThread ( NULL, 0, lpStartAddress, thread_parameters, 0, NULL );				
    }
    
    int main ( void )
    { 
    	my_thread_parameters thread_parameters[2] = {{ "thread_func1", 1 }, { "thread_func2", 2 }};
    	my_thread_starter ( thread_func1, &thread_parameters[0] );
    	Sleep ( 500 );
    	my_thread_starter ( thread_func2, &thread_parameters[1] );
    	Sleep ( 10000 );
    	return 0;
    }
    

    Muhabet schrieb:

    Das Problem, wenn ich Debugger springt der Debugger direkt zu Funktion anstatt mir vorher die Threadroutine zu zeigen , damit ichs mir anschauen kann!

    setze haltepunkte in den treadfunktionen, dann bleibt der debugger dort auch stehen

    btw ist das ganze winapi gefrickel.
    hasta la vista im winapi subforum.

    gruß,
    B.B.



  • Wieso , wenn ich doch die Funktion als DWORD WINAPI funk(Parameter 1,2,3)

    sollte CreateThread die Adresse übernehmen!

    typedef DWORD (WINAPI *PTHREAD_START_ROUTINE)(
        LPVOID lpThreadParameter
        );
    

    So die Definition des Types WINAPI ,das Typdef "PTHREAD_START_ROUTINE" zeigt auf die Adresse der WINAPI , übergebe ich die Funktion als DWORD WINAPI und setze das Typdef als Behandlungsweise voraus so wird die Startadresse übergeben!

    WINAPI ist nen Systemcall welches die Adresse der Funktion dann aufruft!

    Compiler beschwert sich auch nicht!

    Gruß
    Muhabet



  • Muhabet schrieb:

    Wieso , wenn ich doch die Funktion als DWORD WINAPI funk(Parameter 1,2,3)

    sollte CreateThread die Adresse übernehmen!

    typedef DWORD (WINAPI *PTHREAD_START_ROUTINE)(
        LPVOID lpThreadParameter
        );
    

    So die Definition des Types WINAPI ,das Typdef "PTHREAD_START_ROUTINE" zeigt auf die Adresse der WINAPI , übergebe ich die Funktion als DWORD WINAPI und setze das Typdef als Behandlungsweise voraus so wird die Startadresse übergeben!

    WINAPI ist nen Systemcall welches die Adresse der Funktion dann aufruft!

    Compiler beschwert sich auch nicht!

    Gruß
    Muhabet

    träum weiter
    mfg



  • WINAPI steht als __stdcall definiert, dernen internen Prozesse wir selbstverständlich nicht in Codeform vorliegen haben,aber jeder kann sich denken was mit CALLBACK,WINAPI etc. als stdcall abgehandelt wird.

    Flags , Signale usw, für diverse API´s sehen wir in der Dokumentation von MSDN ,das sollte uns Codern ausrechen um Verhalten zu steuern.

    Also wenn du Einwende hast ,bitte ich dich mir doch bitte das genau in deinem Verständnis zu erklären.

    Aber lasse doch die faschistischen Parolen, denn Faschismus und ,ich wills mal so ausdrücken, genetische FATALITÄTEN korrespondieren mal gar nicht friedseelig miteinander.

    Und da du weiter (auch in der Zukunft) ohne Feindseeligkeiten existieren willst ,denke ich das wohl die beste Einstellung für FATALITÄTEN ist 😉

    In diesem Sinne 🤡

    Gruß
    Muhabet



  • Muhabet schrieb:

    startThread(funktion1(a,b,c);
    

    Mal davon abgesehen, dass hier eine schließende Klammer fehlt, ist Dir hoffentlich klar, dass Du bei diesem Aufruf nicht die Adresse der Funktion

    funktion1
    

    an startThread übergibst!


Anmelden zum Antworten