Wie erstell ich einen Thread?
-
Am besten Du erstellst den Timer mit SetTimer. Unter dem Message-Handler für WM_TIMER startest Du dann den Thread mit:
// Hinweis: Du musst in Deinen Compiler-Settings noch Multithreading aktivieren! #include <Process> typedef struct { // Hier die Variablen die Du Deinem Thread übergeben willst... // Beispiel: int iValue; } SThreadData; // Die Strukturvariable muss im Thread noch existieren: static SThreadData ThreadData; unsigned int uiThreadID; // Die ID wird manchmal für best. Funktionen benötigt // Initialisieren: ThreadData.iValue = 20; // (Beispielwert) HANDLE hThread = reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, ThreadProc, &ThreadData, NULL, &uiThreadID)); // ThreadProc ist eine von Dir definierte Funktion, die z.B.: so aussehen könnte: unsigned __stdcall ThreadProc(void* pvThreadData) { // Hier irgendwas machen ;-) ... // ... // Und Verlassen: _endthreadex(0); // Exit-Code: 0 return (0); }
-
gibts net auch noch ne etwas einfachere variante? und was macht _stdcall?
-
__stdcall ist eine Aufrufkonvention, die dem Compiler mitteilt wie er den Funktionsufruf durchführen soll bzw mit den Parametern der Funktion umgehen soll.
[
Sauerei
]
-
@CodeFinder: Ich geb dir nen Tipp: schreib mal ordentlichen Code...
DWORD WINAPI ThreadProc( LPVOID lpParameter );sollte im Moment die Struktur von einer ThreadProc sein..
d.h. hier mal der Link zum MSDN Artikel zum Thema Threads: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/creating_threads.asp
um dir den Code der da ist nen wenig leichter zu machen:
#include <iostream> #include <windows.h> typedef struct _thread_param_t_ { unsigned int nParam1; unsigned short sParam2; } THREADPARAM, *LPTHREADPARAM; DWORD WINAPI ThreadProc(LPVOID lpParam) { LPTHREADPARAM lpThreadParam = reinterpret_cast<LPTHREADPARAM>(lpParam); std::cout <<"Param 1: " << lpThreadParam->sParam2 << " || Param 2: " << lpThreadParam->nParam1 << std::endl; return 0; } int main(void) { THREADPARAM threadparam; DWORD dwThreadId = 0; HANDLE hThread = NULL; threadparam.nParam1 = 10; threadparam.sParam2 = 100; hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, (LPVOID)&threadparam, 0, &dwThreadId); if (hThread == NULL) { std::cout << "Thread konnte nicht erstellt werden!" << std::endl; return 0; } std::cout << "Thread aufgerufen. Warte auf Thread " << dwThreadId << "..." << std::endl; WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); }
-
(D)Evil schrieb:
@CodeFinder: Ich geb dir nen Tipp: schreib mal ordentlichen Code...
DWORD WINAPI ThreadProc( LPVOID lpParameter );sollte im Moment die Struktur von einer ThreadProc sein..
LOL!, Wohl zu viel MFC programmiert wa ?

Nop nicht unbedingt (siehe Kontext!):
_beginthread, _beginthreadex (MSDN)
Ich zitiere
:[...] unsigned ( *start_address )( void * ), [...]PS: Deinen reinterpret_cast kannst und solltest Du gegen einen static_cast tauschen; mein ja nur wegen "schreib mal ordentlichen Code..." :xmas2:
PS-2 & EDIT: Wenn Du unbedingt CreateThread verwenden willst (was ich extra NICHT getan habe), kannst Du auch gleich _beginthread nehmen, das Makro ist IMHO noch leichter zu verstehen
, da wie sich in Deinem Beispiel ja auch zeigt, die meisten Parameter sowieso auf Standardwerte gesetzt werden
(genau das tut das Makro).
-
[...]
-
CodeFinder schrieb:
Am besten Du erstellst den Timer mit SetTimer. Unter dem Message-Handler für WM_TIMER startest Du dann den Thread mit:
// Hinweis: Du musst in Deinen Compiler-Settings noch Multithreading aktivieren! #include <Process> typedef struct { // Hier die Variablen die Du Deinem Thread übergeben willst... // Beispiel: int iValue; } SThreadData; // Die Strukturvariable muss im Thread noch existieren: static SThreadData ThreadData; unsigned int uiThreadID; // Die ID wird manchmal für best. Funktionen benötigt // Initialisieren: ThreadData.iValue = 20; // (Beispielwert) HANDLE hThread = reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, ThreadProc, &ThreadData, NULL, &uiThreadID)); // ThreadProc ist eine von Dir definierte Funktion, die z.B.: so aussehen könnte: unsigned __stdcall ThreadProc(void* pvThreadData) { // Hier irgendwas machen ;-) ... // ... // Und Verlassen: _endthreadex(0); // Exit-Code: 0 return (0); }Wieso machst du ThreadData static? Ist doch schlecht, wenn der Thread mehrmals gestartet wird, dann haben alle die gleiche ThreadData. Mach doch lieber new und der Thread macht delete, wenn er fertig ist
-
ich frage mich nur wieso man eine struct erstellen soll und des ganze per reinterprer_cast in ein handel stopfen muss -.- wieso den net einfach
HANDEL hThread = CreateThread( ... )
hat nicht wer nen schoenes gutes verstaendliches am besten auch gleich noch zu kompilierendes tut?Gruß Tobi, frohes Fest :xmas1: :xmas2:
-
@(D)Evil
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createthread.aspA thread in an executable that calls the C run-time library (CRT) should use the _beginthreadex and _endthreadex functions for thread management rather than CreateThread and ExitThread; this requires the use of the multi-threaded version of the CRT. If a thread created using CreateThread calls the CRT, the CRT may terminate the process in low-memory conditions.
Und wer weiß ob er nicht irgendwo die CRT benutzt?

-
@Alle Jahre wieder! Rud:
Das häntg wie ich schon sagt vom Kontext ab, wenn er nur einen Thread erstellt (und genau das hatte er doch vor), kannst Du Dir die dynamische Allokation sparen und vor der WndProc die Thread-Variable als statich definieren. Da spart man ne Menge Arbeit. Klar, wenn Du mehrere Threads starten willst, kannst natürlich auch new/delete verwenden
.EDIT @yogle: Genau so ist es
.