Benutzer mit den meisten Antworten
AutoResetEvent

Frage
-
Hallo, alle zusammen, ich bin ein Neuling in C++. Ich habe jetzt eine Aufgabe 2 Funktionen in Thread´s auszuführen, so weit habe ich es eigentlich geschafft, aber jetzt habe ich ein Problem, die Threds zu kontrolieren. Jedesmal, wenn ich das Programm starte, habe ich immer wieder einen anderen Ergebniss, liegt wohl daran, dass die Funktionen unkontrolliert parallel laufen, ich habe jetzt gelesen, dass mit Hilfe AutoResetEvent und ManuelResetEvent kann man die Prozesse kontrollieren, können sie mir bitte dabei helfen, die anzuwenden, ich habe zwar mehrere Beispiele angeschaut, aber die nicht verstanden, hier ist mein cpp File
#include "StdAfx.h" #include "Byte.h" Byte::Byte(void) {bytes = NULL;} Byte::~Byte(void) {if (bytes) delete [] bytes;} void Byte::InputString() {while (true) { std::cout << "Enter -> Gib ein Wort ein_: "<<std::endl; getline(cin,str); int i = str.length(); if (i<1) continue; break; } } void Byte::OutputArray() { for (int i=0; i<str.length(); i++) {cout<<str[i]<<"\n";} } void Byte::ConvertArrayToAsci() { for (int i=0; i<str.size(); i++) {printf("%x\n",str[i]);} } unsigned __stdcall Byte::myThread(void* ptr) { Byte* mobj = reinterpret_cast<Byte*>(ptr); mobj->OutputArray(); _endthreadex(0); return(0); } void Byte::Start_Thread() { void* arg_ptr = this; HANDLE hThread; unsigned threadID; hThread = (HANDLE)_beginthreadex(NULL, 0, myThread, arg_ptr, 0, &threadID); ConvertArrayToAsci(); }
Antworten
-
GIDF Würdest Du einfach die MSDN Beschreibung lesen zu _beginthreadex würdest Du unten in der Doku auch ein passendes Beispiel finden.
// crt_begthrdex.cpp // compile with: /MT #include <windows.h> #include <stdio.h> #include <process.h> unsigned Counter; unsigned __stdcall SecondThreadFunc( void* pArguments ) { printf( "In second thread...\n" ); while ( Counter < 1000000 ) Counter++; _endthreadex( 0 ); return 0; } int main() { HANDLE hThread; unsigned threadID; printf( "Creating second thread...\n" ); // Create the second thread. hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID ); // Wait until second thread terminates. If you comment out the line // below, Counter will not be correct because the thread has not // terminated, and Counter most likely has not been incremented to // 1000000 yet. WaitForSingleObject( hThread, INFINITE ); printf( "Counter should be 1000000; it is-> %d\n", Counter ); // Destroy the thread object. CloseHandle( hThread ); }
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Bearbeitet Martin RichterModerator Dienstag, 27. September 2011 14:51
- Als Antwort markiert Nasty33330 Dienstag, 27. September 2011 15:01
Alle Antworten
-
Leider schreibst Du nicht worin sich das Ergebnis unterscheidet.
Leider zeigst Du uns nicht wie Du die Byte Klasse ansonsten verwendest.Ich vermute mal:
Mit events hat das gar nichts zu tun.Ich vermute eher, dass Du eben den Thread startest, aber Dich nicht darum kümmerst, dass der Thread auch terminiert bevor Dein Programm terminiert.
WaitForSingleObject ist hier das Zauberwort.
BTW: _enthreadex musst Du nicht aufrufen. mach einfache einen return aus Deiner thread-Funktion.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de -
GIDF Würdest Du einfach die MSDN Beschreibung lesen zu _beginthreadex würdest Du unten in der Doku auch ein passendes Beispiel finden.
// crt_begthrdex.cpp // compile with: /MT #include <windows.h> #include <stdio.h> #include <process.h> unsigned Counter; unsigned __stdcall SecondThreadFunc( void* pArguments ) { printf( "In second thread...\n" ); while ( Counter < 1000000 ) Counter++; _endthreadex( 0 ); return 0; } int main() { HANDLE hThread; unsigned threadID; printf( "Creating second thread...\n" ); // Create the second thread. hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID ); // Wait until second thread terminates. If you comment out the line // below, Counter will not be correct because the thread has not // terminated, and Counter most likely has not been incremented to // 1000000 yet. WaitForSingleObject( hThread, INFINITE ); printf( "Counter should be 1000000; it is-> %d\n", Counter ); // Destroy the thread object. CloseHandle( hThread ); }
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Bearbeitet Martin RichterModerator Dienstag, 27. September 2011 14:51
- Als Antwort markiert Nasty33330 Dienstag, 27. September 2011 15:01