[WinAPI] Pętla komunikatów w drugim wątku.
Ostatnio zmodyfikowano 2014-08-09 22:10
Vister26 Temat założony przez niniejszego użytkownika |
[WinAPI] Pętla komunikatów w drugim wątku. » 2014-08-09 21:43:56 Ostatnio zabrałem się za napisanie prostego komunikatora GUI w WinAPI(serwer i dwa klienty). Pierwszym problemem jaki napotkałem jest to, że serwer oczekując na próbę połączenia od klienta nie może w tym samym czasie obsługiwać kolejki komunikatów, co w krótkim czasie prowadzi do zawieszki. Próbowałem rozwiązać ten problem z pomocą wątków(threads), jednak ciągle coś jest nie tak. Testy przeprowadzałem na najprostszym programie z jednym oknem. Zmieniłem tylko jedno - pętlę komunikatów uruchamiam w drugim wątku: #include <tchar.h> #include <windows.h>
#include <process.h>
MSG messages;
void __cdecl messageLoop( void * Args );
LRESULT CALLBACK WindowProcedure( HWND, UINT, WPARAM, LPARAM );
TCHAR szClassName[] = _T( "CodeBlocksWindowsApp" );
int WINAPI WinMain( HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow ) { HWND hwnd; WNDCLASSEX wincl; wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; wincl.style = CS_DBLCLKS; wincl.cbSize = sizeof( WNDCLASSEX ); wincl.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wincl.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); wincl.hCursor = LoadCursor( NULL, IDC_ARROW ); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground =( HBRUSH ) COLOR_BACKGROUND; if( !RegisterClassEx( & wincl ) ) return 0; hwnd = CreateWindowEx( 0, szClassName, _T( "Code::Blocks Template Windows App" ), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, hThisInstance, NULL ); ShowWindow( hwnd, nCmdShow ); HANDLE hMessageLoop =( HANDLE ) _beginthread( messageLoop, 0, NULL ); WaitForSingleObject( hMessageLoop, 10000 ); return messages.wParam; }
LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) { case WM_DESTROY: PostQuitMessage( 0 ); break; default: return DefWindowProc( hwnd, message, wParam, lParam ); } return 0; }
void __cdecl messageLoop( void * Args ) { while( GetMessage( & messages, NULL, 0, 0 ) ) { TranslateMessage( & messages ); DispatchMessage( & messages ); } _endthread(); }
PS Wątkami zajmuje się właściwie od wczoraj. Proszę nie bijcie ;) |
|
Monika90 |
» 2014-08-09 22:10:33 Pętla komunikatów musi być w tym wątku który utworzył okno. |
|
« 1 » |