Announcement

Collapse
No announcement yet.

Problem mit CreateThread

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit CreateThread

    hallo,

    ich experimentiere derzeit mit threads herum, da ich auch mal per api einen thread erzeugen möchte habe ich folgendes geschrieben:

    Code:
    #include<windows.h>
    #include<process.h>
    #include<iostream>
    
    using namespace std;
    
    int count;
    
    
    
    //Funktion TuWas
    unsigned _stdcall TuWas(int arg){
    	
    	for (int i=0; i <= arg; i++)
    	{
    		Sleep(1000);
    		cout << "i = " << i << " arg = " << arg << endl;
    		count = count + 1;
    	}
    }
    
    int main(){
    
    	HANDLE hth;
    	DWORD a;
    	DWORD thID;
    	int arg = 0;
    
    	//count auf 90 setzen
    	count = 90;
    
    	//Thread erzeugen
    	hth= CreateThread(NULL, 
    					  0, 
    				      TuWas,
    					  a,
    				      0,
    					  thID);
    
    	
    	
    	TuWas(3);
    	
    	//count ausgeben
    	cout << "\n" << count << endl << endl;
    
    	CloseHandle(hth);
    }
    Leider bekomme ich dann eine Fehlermeldung dass eine Konvertierung nicht möglich ist, doch leider weiß ich jetzt nicht wie ich das lösen kann.

    Code:
    Fehler	1	error C2664: 'CreateThread': Konvertierung des Parameters 3 von 'unsigned int (__stdcall *)(int)' in 'LPTHREAD_START_ROUTINE' nicht möglich
    Wer kann mir helfen?

    Danke im Vorraus

    Gruß

    Bladerunner

  • #2
    Parameter 3 sollte ein Zeiger auf die Funktion sein

    http://msdn.microsoft.com/en-us/libr...53(VS.85).aspx
    Christian

    Comment


    • #3
      So jetzt hab ich

      hth= CreateThread(NULL,
      0,
      (LPTHREAD_START_ROUTINE) TuWas,
      a,
      0,
      thID);
      aber dann bekomme ich einen erneuten Fehler:

      Fehler 1 error C2664: 'CreateThread': Konvertierung des Parameters 4 von 'DWORD' in 'LPVOID' nicht möglich.

      Was muß ich denn nun noch ändern?

      Comment


      • #4
        Parameter 4 ist kein DWORD, sondern ein LPVOID

        Steht doch in der Meldung und schau dir die Beschreibung an
        Christian

        Comment


        • #5
          Ok ich habs geschafft! Es läuft Allerdings ist die Ausgabe alles andere als erwartet.

          Der Code sieht jetzt folgendermaßen aus:
          Code:
          #include<windows.h>
          #include<process.h>
          #include<iostream>
          
          using namespace std;
          
          int count;
          
          
          
          //Funktion TuWas
          unsigned _stdcall TuWas(int arg){
          	
          	for (int i=0; i <= arg; i++)
          	{
          		Sleep(1000);
          		cout << "i = " << i << " arg = " << arg << endl;
          		count = count + 1;
          	}
          	return 0;
          }
          
          int main(){
          
          	HANDLE hth;
          	DWORD a;
          	DWORD thID;
          	int arg = 0;
          
          	//count auf 90 setzen
          	count = 90;
          
          	//Thread erzeugen
          	hth= CreateThread(NULL, 
          					  0, 
          				      (LPTHREAD_START_ROUTINE) TuWas,
          					  &a,
          				      0,
          					  &thID);
          
          	
          	
          	TuWas(3);
          	
          	//count ausgeben
          	cout << "\n" << count << endl << endl;
          
          	CloseHandle(hth);
          }
          Die Ausgabe verwirrt mich jetzt aber komplett und ist alles andere als erwartet.
          Was ist denn jetzt noch falsch!
          Sorry dass ich so banale Fragen stelle aber ich bin noch recht neu in der Materie. Ich bitte also um Nachsicht

          Comment


          • #6
            Kann mir denn keiner helfen, bzw sagen warum meine Ausgabe total daneben geht?

            Comment


            • #7
              Nein, weil keiner das Ist und das Soll (kann man noch am Code erkennen) deiner Ausgabe kennt.

              Die Ausgabe verwirrt mich jetzt aber komplett und ist alles andere als erwartet.
              Tja.....was soll man sagen...
              Christian

              Comment


              • #8
                Ok das hab ich vergessen! Sorry

                Ich erwartete eigentlich etwas in der Art von:

                i = 0 arg = 3
                i = 1 arg = 3
                i = 2 arg = 2
                i = 3 arg = 3

                94

                wenn ich TuWas(3) aufrufe

                Doch die Ausgabe folgendermaßen aus und ist für mich unerklärbar.



                Was läuft da schief?
                count wird viel zu oft hochgezählt und die Formatierung der Ausgabe besonders der Wert für arg oder was auch immer diese 1245012 sein soll ist mir ein Rätsel.

                Comment


                • #9
                  Ist doch ganz einfach:

                  Schau dir nochmal an wie Threads funktionieren:

                  Mit
                  hth= CreateThread(NULL,.....
                  wird dein Thread erzeugt UND gestartet. Da nun der arg nicht inititialisiert ist, wird der Wer, der da gerade drin steht genommen.

                  Mit
                  TuWas(3);
                  rufst du ZUSÄTZLICH die Funktion auf, die dann die Ausgabe mit der 3 erzeugt


                  ergänze dein Programm um
                  # include <conio.h>
                  bei den includes

                  Lösche die Zeile tuwas(3)

                  füge nach dem Close ein
                  getch();

                  und beobachte
                  Christian

                  Comment

                  Working...
                  X