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