Threads



  • Hallo! Und zwar hab ich ein Server - Socket - Programm, das aber leider nur einen Client verarbeiten kann! Ich möchte, dass wenn sich ein Client anmeldet, dass sich auch noch ein weiterer anmelden kann und so weiter! Hab gehört, das würd mit select () so ungefähr auch gehen! Nur find ich keine Entsprechende Hilfe zu genau meinem Problem. Ich programmier unter Windows 2000 und die Funktion _beginthreadex ist auch nicht sehr verständlich!



  • Ich habe mir für mich mal einen Muster-Thread gebastelt.
    Vielleicht kannst du damit was anfangen.
    Du musst dein Projekt vor dem Compilieren auf Multithreaded einstellen.

    /*-----------------------------------------------------------------------
      Muster-Thread.cpp 
    
      www.winapi.net
      -----------------------------------------------------------------------*/
    
    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include <process.h>
    
    // global
    typedef struct
    {
       volatile BOOL ThreadStoppen;
    }PARAMS, *PPARAMS;
    
    static unsigned uThreadId;
    
    unsigned __stdcall ThreadFunc(void*);
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName[] = TEXT ("Class-Name");
         HWND         hwnd;
         MSG          msg;
         WNDCLASSEX   wndclassex = {0};
    
        wndclassex.cbSize        = sizeof(WNDCLASSEX);  
         wndclassex.style         = CS_HREDRAW | CS_VREDRAW;
         wndclassex.lpfnWndProc   = WndProc;
         wndclassex.cbClsExtra    = 0;
         wndclassex.cbWndExtra    = 0;
         wndclassex.hInstance     = hInstance;
         wndclassex.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
         wndclassex.hCursor       = LoadCursor (NULL, IDC_ARROW);
         wndclassex.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
         wndclassex.lpszMenuName  = NULL;
         wndclassex.lpszClassName = szAppName;
        wndclassex.hIconSm       = wndclassex.hIcon;
    
         if (!RegisterClassEx (&wndclassex))
         {     
              MessageBox (NULL, TEXT ("RegisterClassEx fehlgeschlagen!"), 
                          szAppName, MB_ICONERROR);
              return 0;
         }
    
         hwnd = CreateWindowEx    (WS_EX_OVERLAPPEDWINDOW,      // erweiterter Fensterstil
                            szAppName,              // Name der Fensterklasse
                            TEXT ("Fenstertitel"),      // Fenstertitel
                            WS_OVERLAPPEDWINDOW,        // Fensterstil
                            CW_USEDEFAULT,              // X-Position des Fensters
                            CW_USEDEFAULT,              // Y-Position des Fensters
                            CW_USEDEFAULT,              // Fensterbreite
                            CW_USEDEFAULT,              // Fensterhöhe
                            NULL,                   // übergeordnetes Fenster
                            NULL,                   // Menü
                            hInstance,              // Programm-Kopiezähler (Programm-ID)
                            NULL);                  // zusätzliche Parameter
    
         ShowWindow (hwnd, iCmdShow);
         UpdateWindow (hwnd);
    
         while (GetMessage (&msg, NULL, 0, 0))
         {
              TranslateMessage (&msg);
              DispatchMessage (&msg);
         }
         return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {           
         HDC         hdc;
         PAINTSTRUCT ps;
        static PARAMS params;
    
         switch (message)
         {
         case WM_CREATE:
            params.ThreadStoppen = FALSE;
            _beginthreadex (NULL, 0, &ThreadFunc, ¶ms, 0, &uThreadId);         
            return (0);
    
         case WM_PAINT:
              hdc = BeginPaint (hwnd, &ps);
    
              EndPaint (hwnd, &ps);
              return (0);
    
         case WM_DESTROY:
            params.ThreadStoppen = TRUE;
              PostQuitMessage (0);
              return (0);
         }
         return DefWindowProc (hwnd, message, wParam, lParam);
    }
    
    /////////////////////////////////////////////////////////////////////////////////
    
    // die Thread-Funktion
    unsigned  __stdcall ThreadFunc(void* pVoid)
    {
       PPARAMS pparams;
       pparams = (PPARAMS) pVoid;
    
       while (!pparams->ThreadStoppen) // solange weitermachen bis TRUE
       {
           MessageBeep (MB_ICONQUESTION);
           Sleep (1000);
       }
       return (1);
    }
    

Anmelden zum Antworten