Erstellen und Aufrufen eines Threads aus einer MFC Anwendung heraus



  • Hallo,

    ich möchte in meiner MFC Applikation einen Thread aufrufen.
    Dieser Thread besitzt folgende Funktion:

    DWORD WINAPI ThreadProc() 
    { 
    
    	for(;;)
    	{
    		SOCKET AcceptSocket;
    		AcceptSocket = SOCKET_ERROR;
    		// Accept the connection.
    		while( AcceptSocket == SOCKET_ERROR ) {
    
    			AcceptSocket = accept( ListenSocket, NULL, NULL );
    		}
    		WSACleanup();
    	}
    	return 0;
    }
    

    Aufgerufen wird diese Threadfunktion folgendermaßen:

    ...

    void CFireWallTestDlg::OnBnClickedStart()
    {
    
    HANDLE hThread;
    		hThread = CreateThread(NULL, NULL, ThreadProc, NULL, 0, NULL);
    }	
    
    } //CFireWallTestDlg::OnBnClickedStart()
    

    Folgenden Fehler erhalte ich beim Compilieren:
    **
    error C2664: 'CreateThread' : cannot convert parameter 3 from 'void (void)' to 'LPTHREAD_START_ROUTINE'
    None of the functions with this name in scope match the target type**

    Die Compilersettings habe ich überprüft, sind korrekt.
    Eine Win32 Consolenanwendung / Projekt kommt mit diese Code klar.
    Daher liegt es sicher am MFC vermute ich. 😕

    Kann mir jemand bitte sagen wie ich den Code anpassen muss, um diesen lauffähig zu machen?

    Danke vielmals!!! 🙂



  • Thread_Problem schrieb:

    Hallo,

    ich möchte in meiner MFC Applikation einen Thread aufrufen.
    Dieser Thread besitzt folgende Funktion:

    DWORD WINAPI ThreadProc() 
    { 
    
    	for(;;)
    	{
    		SOCKET AcceptSocket;
    		AcceptSocket = SOCKET_ERROR;
    		// Accept the connection.
    		while( AcceptSocket == SOCKET_ERROR ) {
    
    			AcceptSocket = accept( ListenSocket, NULL, NULL );
    		}
    		WSACleanup();
    	}
    	return 0;
    }
    

    Aufgerufen wird diese Threadfunktion folgendermaßen:

    ...

    void CFireWallTestDlg::OnBnClickedStart()
    {
    
    HANDLE hThread;
    		hThread = CreateThread(NULL, NULL, ThreadProc, NULL, 0, NULL);
    }	
    
    } //CFireWallTestDlg::OnBnClickedStart()
    

    Folgenden Fehler erhalte ich beim Compilieren:
    **
    error C2664: 'CreateThread' : cannot convert parameter 3 from 'void (void)' to 'LPTHREAD_START_ROUTINE'
    None of the functions with this name in scope match the target type**

    Die Compilersettings habe ich überprüft, sind korrekt.
    Eine Win32 Consolenanwendung / Projekt kommt mit diese Code klar.
    Daher liegt es sicher am MFC vermute ich. 😕

    Kann mir jemand bitte sagen wie ich den Code anpassen muss, um diesen lauffähig zu machen?

    Danke vielmals!!! 🙂

    Problem gelöst!!!

    [cpp]hThread = CreateThread(NULL, NULL, **(void)**ThreadProc, NULL, 0, NULL);[/cpp]


  • Mod

    Wenn Du gedenkst auch die CRT zu verwenden solltest Du CreateThread meiden und _beginthreadex verwenden. Andernfalls werden die threadlokalen CRT Daten beim Ende des Threads nicht freigegeben.



  • Martin Richter schrieb:

    Wenn Du gedenkst auch die CRT zu verwenden solltest Du CreateThread meiden und _beginthreadex verwenden. Andernfalls werden die threadlokalen CRT Daten beim Ende des Threads nicht freigegeben.

    Was sind denn "threadlokalen CRT Daten" genau ? 😕



  • ok die sache hat sich erledigt ein freund hats mir gesagt 😃

    Danke an euch 😡 🙄 😡 🙄 😮 😮 😮 😮 😮


  • Mod

    CodeFinder schrieb:

    Martin Richter schrieb:

    Wenn Du gedenkst auch die CRT zu verwenden solltest Du CreateThread meiden und _beginthreadex verwenden. Andernfalls werden die threadlokalen CRT Daten beim Ende des Threads nicht freigegeben.

    Was sind denn "threadlokalen CRT Daten" genau ? 😕

    Die CRT hat je Thread einen Datenblock, der z.B. statische Puffer für strtok, time etc bereithält, auch Teile der locale gehören dazu. Wird also eine CRT Funktion in einem Thread aufgerufen die mit CreateThread angelegt wird, dann wird dieser Buffer angelegt. Aber ohne Aufruf der CRT Funktion endthread wird dieser nicht wieder freigegeben. Also besser _beginthreadex verwenden und einfach aus der Threadfunktion returnieren.

    Siehe auch http://www.microsoft.com/msj/0799/Win32/Win320799.aspx



  • Warum fragtest du dies eigentlich im WinAPI Teil dieses Forums und nicht im MFC Teil? Bei MFC verwendet man AfxBeginThread ...



  • Martin Richter schrieb:

    [...]
    Die CRT hat je Thread einen Datenblock, der z.B. statische Puffer für strtok, time etc bereithält, auch Teile der locale gehören dazu. Wird also eine CRT Funktion in einem Thread aufgerufen die mit CreateThread angelegt wird, dann wird dieser Buffer angelegt. Aber ohne Aufruf der CRT Funktion endthread wird dieser nicht wieder freigegeben. Also besser _beginthreadex verwenden und einfach aus der Threadfunktion returnieren.

    Siehe auch http://www.microsoft.com/msj/0799/Win32/Win320799.aspx

    Jo dank dir 👍 ! ... geschekkt^^ 💡


Anmelden zum Antworten