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 identifierSetThreadPriority(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ß,
KevinP.S.: Sowas gehört sich ins WINAPI-Forum
