none
AutoResetEvent RRS feed

  • 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();
    }
    
    


    Dienstag, 27. September 2011 13:02

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
    Dienstag, 27. September 2011 14:50
    Moderator

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
    Dienstag, 27. September 2011 13:58
    Moderator
  • danke erstmal........ja, das ist das Problem.....hast du vielleicht zufällig ein Beispiel zu der Funktion parat??))
    jhl
    Dienstag, 27. September 2011 14:32
  • 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
    Dienstag, 27. September 2011 14:50
    Moderator
  • Danke, Martin))
    jhl
    Dienstag, 27. September 2011 15:54