Was sind Threads?



  • Hi,

    was sind eigentlich in einem Programm Threads? In der Spieleprogrammierung hör ich davon gelegentlich schon mal und frag mich oft, was ist das eigentlich, wofür ist das und wie kann man das in C++ Realisieren? 😕



  • einfach gesagt sind threads programmteile die zur Laufzeit PARALELL (zur gleichen zeit) ausgeführt werden.



  • Wieso wurde dieses Thema verschoben? es ging doch um C++?!?!?!?! Man echt super Mods verschieben ohne zu schreiben wieso. echt super 😞 👎 👎 👎



  • *** schrieb:

    Wieso wurde dieses Thema verschoben? es ging doch um C++?!?!?!?! Man echt super Mods verschieben ohne zu schreiben wieso. echt super 😞 👎 👎 👎

    Weils Threads auch in Java, Basic, Perl, .... gibt passt "Rund um die Prorgammierung" doch wesentlich besser.



  • was sind eigentlich in einem Programm Threads?

    Das ist eine von einer konkreten Programmiersprache unabhängige Frage.

    und wie kann man das in C++ Realisieren

    In *Standard*-C++ überhaupt nicht, denn Standard-C++ kennt keine Threads. Dazu brauchst du Hilfe von deiner BS-API bzw. einer Bibliothek wie z.B. pthreads.

    So, wie du siehst, passt die Frage nicht nach C++. Deshalb habe ich sie hier her verschoben, da hier der erste Teil deiner Frage am Besten geklärt werden kann und ein gewisses Verständnis für Thread ist die Voraussetzung um mit der MT-Programmierung beginnen zu können.

    Bevor du hier rumnörgelst, solltest du vielleicht erstmal das lesen:
    http://www.c-plusplus.net/forum/viewtopic.php?t=39405



  • In der C-Runtime-Library gibts dafür die Funktionen

    _beginthread()
    _endthread(),
    

    welche in der Process.h enthalten sind.



  • WebFritzi schrieb:

    In der C-Runtime-Library gibts dafür die Funktionen

    _beginthread()
    _endthread(),
    

    welche in der Process.h enthalten sind.

    Das sind aber *Windows*-Only Funktionen.





  • HumeSikkins schrieb:

    WebFritzi schrieb:

    In der C-Runtime-Library gibts dafür die Funktionen

    _beginthread()
    _endthread(),
    

    welche in der Process.h enthalten sind.

    Das sind aber *Windows*-Only Funktionen.

    Nö.

    Die gibt's auch in jedem OS/2-Compiler den ich bisher verwendet habe (IBM, Borland). Immer diese Verallgemeinerungen 🙂 Nur weil's etwas unter *n?x nicht gibt heisst noch lange nicht dass es Windows-Only ist...



  • Simpler Beispielcode zum Spielen:

    #include <windows.h> 
    #include <process.h>  /* _beginthread, _endthread ... */ 
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); 
    
    int Flag = 1; 
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                        PSTR szCmdLine, int iCmdShow) 
    { 
         static TCHAR szAppName[] = TEXT ("Thread Test"); 
         MSG          msg; 
         WNDCLASS     wndclass; 
    
         wndclass.style         = CS_HREDRAW | CS_VREDRAW; 
         wndclass.lpfnWndProc   = WndProc; 
         wndclass.cbClsExtra    = 0; 
         wndclass.cbWndExtra    = 0; 
         wndclass.hInstance     = hInstance; 
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION); 
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW); 
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); 
         wndclass.lpszMenuName  = NULL; 
         wndclass.lpszClassName = szAppName; 
    
         RegisterClass (&wndclass); 
         HWND hwnd = CreateWindow (szAppName, TEXT ("Thread Test"), 
                              WS_OVERLAPPEDWINDOW, 100, 100, 300, 100, 
                              NULL, NULL, hInstance, NULL) ; 
    
         ShowWindow (hwnd, iCmdShow); 
         UpdateWindow (hwnd); 
    
         while (GetMessage (&msg, NULL, 0, 0)) 
         { 
              TranslateMessage (&msg); 
              DispatchMessage  (&msg); 
         } 
         return msg.wParam; 
    } 
    
    VOID Thread (PVOID pvoid) 
    { 
      while(Flag) 
      { 
        Sleep(1000); 
        MessageBeep(0); 
      } 
    } 
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
    { 
         switch (message) 
         { 
         case WM_LBUTTONDOWN: /* startet Thread */ 
              Flag = 1; 
              _beginthread (Thread, 0, NULL); 
              return 0; 
    
         case WM_RBUTTONDOWN: /* stoppt Thread */ 
              Flag = 0; 
              return 0; 
    
        case WM_DESTROY: 
              PostQuitMessage (0); 
              return 0; 
         } 
         return DefWindowProc (hwnd, message, wParam, lParam) ; 
    }
    

    Hinweis für MSVC++:
    Bei den Projekteinstellungen für C/C++ unter Code Generation die Laufzeit-Bibliothek auf Multithreaded umstellen, damit das Compiler Flag /MT gesetzt wird, ansonsten gilt _beginthread(...) als nicht deklariert.



  • @frenki
    Entschuldige Bitte meine Unwissenheit.
    Ich hatte die Info aus der MSDN. Da steht unter Compatibility Win95, WinNT.

    Wie auch immer. Ich wollte auch nur daraufhinweisen, dass dies keine *Standard*-C Funktionen sind. Dies *könnte* man schließlich vermuten, wenn man C Runtime-Lib liest.


Anmelden zum Antworten