Problem mit Parameterübergabe an Thread



  • Leider funktioniert das von mir modifizierte Beispiel aus der MSDN
    (wer Visual c++.Net Installiert hat ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1031/dllproc/base/creating_threads.htm ) nicht.

    Es sollte eigentlich 60 ausgegeben werden es kommt aber 1244800.
    Wo liegt bloss das Problem.

    Hier der Quellcode:

    [cpp]
    #include <windows.h>
    #include <conio.h>

    DWORD WINAPI ThreadFunc( LPVOID lpParam )
    {
    char szMsg[80];

    wsprintf( szMsg, "Parameter = %d.", (DWORD)lpParam );
    MessageBox( NULL, szMsg, "ThreadFunc", MB_OK );

    return 0;
    }

    HANDLE Start_Window_Observer()
    {
    DWORD dwThreadId, dwThrdParam = 60;
    HANDLE hThread;

    hThread = CreateThread(
    NULL, // default security attributes
    0, // use default stack size
    ThreadFunc, // thread function
    &dwThrdParam, // argument to thread function
    0, // use default creation flags
    &dwThreadId); // returns the thread identifier

    SetThreadPriority(hThread, THREAD_PRIORITY_ABOVE_NORMAL);
    return hThread;
    }

    HANDLE Stop_Window_Observer(HANDLE hThread)
    {
    TerminateThread(hThread, 0);
    CloseHandle(hThread);
    hThread = NULL;
    return hThread;
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
    HANDLE hThread;
    printf("Window Observer gestartet\n\n");
    hThread = Start_Window_Observer();
    while(getchar() != '\n');
    hThread = Stop_Window_Observer(hThread);
    return 0;
    }
    [/cpp]



  • Hi!
    Das Problem ist, dass der Thread erst startet, wenn die Funktion Start_Window_Observer() schon zu Ende ist, und dann wird die Variable dwThrdParam eben gelöscht. Entweder du machst ein Sleep(1); nach deinem CreateThread Aufruf, damit der Thread startet, bevor die Funktion Start_Window_Observer() zu Ende ist, oder du machst es so:

    #include <windows.h> 
    #include <conio.h> 
    #include "stdio.h"
    
    DWORD WINAPI ThreadFunc( LPVOID lpParam ) 
    { 
        char szMsg[80]; 
    
        wsprintf( szMsg, "Parameter = %d.", *(DWORD*)lpParam ); 
        MessageBox( NULL, szMsg, "ThreadFunc", MB_OK ); 
    
    	delete (DWORD*)lpParam;
    
        return 0; 
    } 
    
    HANDLE Start_Window_Observer() 
    { 
        DWORD dwThreadId; 
        HANDLE hThread;
    	DWORD* dwThrdParam = new DWORD;
    	*dwThrdParam = 60;
    
        hThread = CreateThread( 
            NULL,                        // default security attributes 
            0,                           // use default stack size   
            ThreadFunc,                  // thread function 
            dwThrdParam,                // argument to thread function 
            0,                           // use default creation flags 
            &dwThreadId);                // returns the thread identifier 
    
    	//Sleep(1);
    
        SetThreadPriority(hThread, THREAD_PRIORITY_ABOVE_NORMAL); 
        return hThread; 
    } 
    
    HANDLE Stop_Window_Observer(HANDLE hThread) 
    { 
        TerminateThread(hThread, 0); 
        CloseHandle(hThread); 
        hThread = NULL; 
        return hThread; 
    } 
    
    int main(int argc, char* argv[]) 
    { 
       HANDLE hThread; 
       printf("Window Observer gestartet\n\n"); 
       hThread = Start_Window_Observer(); 
       while(getchar() != '\n'); 
       hThread = Stop_Window_Observer(hThread); 
       return 0; 
    }
    

    Hoffe, dir geholfen zu haben,
    Gruß,
    Kevin

    P.S.: Sowas gehört sich ins WINAPI-Forum 🙂


Anmelden zum Antworten