Threads unter Windows



  • Hallo,

    ich wollte mich grad mal bisschen über Threads schlau lesen, da ich sie jetzt benötige. Bei Wikipdia habe ich ungefähr verstanden, wie men einen T aufruft. Aba ich weiss jetzt irgendwie nicht weiter.

    Könnt ihr mir bei einem ganz einfachem Beispiel helfen, damit ich es auch verstehe?:

    while(1)
    {
        getchar();
        printf("Hallo Welt\n");
    }
    

    Das soll immer ausgeführt werden.

    if (a==1)
        a=0;
    else
        a=1
    

    Das soll nebenbei im Thread ausgeführt werden.

    Das Programm wartet also auf Eingabe, schiebt abaer zwischendurch immer eine 1 und 0 durch int a

    Mein eigentliches Programm macht natürlich etwas anderes, abaer könnt ihr mir am Beispuiel vielleicht Zeigen, wie es geht?



  • Vielleicht solltest du dich doch noch etwas intensiver mit Threads beschäftigen 😉

    OK, mal langsam: Zunächst mußt du das, was nebenher passieren soll, in eine Threadfunktion auslagern (das macht jedoch nur Sinn, wenn die Arbeit etwas länger dauert und das Hauptprogramm die Ergebnisse nicht sofort braucht - für so ein einfaches if()/else lohnt sich kein Extra-Thread):

    UINT thread_func(LPVOID param)
    {
      // mach irgendwas
      return 0;
    }
    

    Anschließend mußt du aus deinem Hauptprogramm heraus den Thread anstoßen:

    _beginthread(thread_function/*Name der Funktion*/,NULL/*Parameter für die Funktion*/);
    

    Nachdem der Thread läuft, kannst du mit dem Hauptprogramm weitermachen (und z.B. in deine Endlosschleife reingehen).



  • Dieser Thread wurde von Moderator/in Shade Of Mine aus dem Forum ANSI C in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Läuft _beginthread auch unter anderen OS oder nur unter Windows?



  • Ich glaub das ist nur für Windows, hab mich da zwar noch nie wirklich reingearbeitet, aber es sollte Plattformabhängig sein.

    Gruß Chris



  • Besten Dank! Mein Programm sieht jetzt so aus:

    #include <stdio.h>
    
    int a;
    
    int main()
    {
    	_beginthread(thread_function, NULL);
    
    	while(1) 
    	{ 
    	    getchar(); 
    	    printf("Hallo Welt\n"); 
    	}	 
    
    	return 0;
    }
    
    UINT thread_function(LPVOID param) 
    { 
    	if (a==1) 
        	a=0; 
    	else 
        	a=1;  
      return 0; 
    }
    

    und es gibt 3 Fehler.

    • für _beginthread fehlt der Prototyp
    • thread_function ist ein undeclared identifier
    • UINT thread_function(LPVOID param) wird angezeigt: Expecting ';'

    Kann nochmal jemand helfen?



  • Sollte man glaube ich vorher auch bekannt geben vorallem wenn mann ne funktion ans ende des programms setzt.

    #include <stdio.h>
    
    int a;
    //Hier
    UINT thread_function(LPVOID param);
    
    int main()
    {
    	_beginthread(thread_function, NULL);
    
    	while(1) 
    	{ 
    	    getchar(); 
    	    printf("Hallo Welt\n"); 
    	}	 
    
    	return 0;
    }
    
    UINT thread_function(LPVOID param) 
    { 
    	if (a==1) 
        	a=0; 
    	else 
        	a=1;  
      return 0; 
    }
    


  • ok, ich habe die thread-funktion jetzt an den anfang gestellt. jetzt sind es nur noch zwei fehler:

    syntax error; found 'identifier' expecting ';'.
    (Bei UINT thread_function(LPVOID param) )

    und

    Missing prototype.
    (Bei _beginthread(thread_function, NULL);)



  • Vieleicht fehlt da noch was hiern Kleines Bsp.

    [cpp]
    #include <windows.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include <conio.h>
    #include <process.h>
    
    void ThreadProc(void *param);
    
    int main()
    {
    
      int n;
      int i;
      int val = 0;
      HANDLE handle;
    
      printf("\t Thread Demo\n");
    
      printf("Enter the number of threads : ");
      scanf("%d",&n);
    
      for(i=0;i<n;i++)
      {
        val = i+1;
        handle = (HANDLE) _beginthread( ThreadProc,0,&val); 
        WaitForSingleObject(handle,INFINITE);
      }
      return 0;
    }
    
    void ThreadProc(void *param)
    {
    
     int h=*((int*)param);
     printf("%d Thread is Running!\n",h);
     _endthread();
    
    }[/cpp]
    


  • Für _beginthread() und die typedef's benötigst du natürlich den richtigen Header (müsste <windows.h> sein)

    @Badestrand: _beginthread() gibt's nur unter Windows - Unix hat da sicher eigene Funktionen dafür (ich kenne auf Anhieb nur fork(), aber das erzeugt einen neuen Prozess).



  • _beginthread und _beginthreadex finden sich in der <process.h> - die sind Teil der MSVC Runtime und nicht Teil von Windows.

    Unter *NIX verwendet man üblicherweise PTHREADS, ausgenommen Solaris und einige andere "Exoten".


Anmelden zum Antworten