Bonjour
,
J'ai un bug sur programme que je n'arrive pas à résoudre
. j'ai du mal avec le C/C++...
Je vous explique :
J'ai un main dans lequel je déclare une WNDCLASSEX puis je crée une fenetre... jusque là tout va bien.
Ensuite je fait un thread et un evenement.
Le fils est la fonction "showWindowThread". le MessageBox s'affiche bien mais il ne rentre jamais dans la boucle while (GetMessage(&msg, NULL, 0, 0)). Par consequent la fentre est reduite et ne peut jamais s'aggrandir ni se fermer.
Par contre le père s'execute bien. et si je mets le fils à la place du père la gestion de la fenetre est parfaite... Mais je ne peux pas echanger le père et le fils...
Pourquoi je ne peux plus aggrandir la fenetre ni la fermer ???
Je vous donne mon programme simplifié, j'espere que cela suffira :
//-----------------------------------------------------------------------------
// showWindowThread
//
DWORD WINAPI showWindowThread(
IN LPVOID pParam)
// thread context
{
int ret = 0;
MSG msg;
MessageBox(NULL, "Je suis le fils", "Message", MB_OK);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
ret = msg.wParam;
//** Débloquer le thread
if (g_endEvent)
::SetEvent(g_endEvent);
return 0;
}
// showWindowThread
//-----------------------------------------------------------------------------
// _tWinMain
int
APIENTRY _tWinMain(
HINSTANCE instance,
// instance
HINSTANCE prevInstance,
// previous intance
LPTSTR cmdLine,
// command line
int cmdShow) // show command
{
// register window class
WNDCLASSEX wcex;
wcex.cbSize =
sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)wndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = instance;
wcex.hIcon = LoadIcon(instance, MAKEINTRESOURCE(IDI_ICON));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = pServerApp->m_windowClassName;
wcex.hIconSm = NULL;
if(!RegisterClassEx(&wcex))
{
MessageBox(NULL, "Erreur lors de l'enregistrement de la classe fenêtre principale", "Erreur", MB_OK);
return 1;
}
[...]
pServerApp->m_wnd = CreateWindow(
pServerApp->m_windowClassName,
pServerApp->m_appTitle,
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_ICONIC,
0,
// Position en X de la fenetre, utiliser la valeur par défaut
0,
// Position en Y de la fenetre, utiliser la valeur par défaut
400,
// Largeur de la fenêtre, utiliser la valeur par défaut
0,
// Hauteur de la fenêtre, utiliser la valeur par défaut
NULL,
// Handle de la fenêtre parent; il s'agit de la fenetre mère, on met NULL
NULL,
// Handle de menu, on n'en veut pas, on met NULL
instance,
// Instance de l'application
NULL);
// Non nécessaire pour le moment
[...]
#ifdef
_DEBUG
// show the window in debug version
if (pServerApp->m_wnd)
{
ShowWindow(pServerApp->m_wnd, SW_MINIMIZE);
UpdateWindow(pServerApp->m_wnd);
}
#endif
[...]
g_endEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
hThread=CreateThread(NULL, 0, showWindowThread, NULL, 0, &tid);
CloseHandle(hThread);
if (hThread == NULL)
MessageBox(NULL, "Pb lors de la creation du thread", "THREAD", MB_OK);
else{
while (WAIT_TIMEOUT == ::WaitForSingleObject(g_endEvent, waitTime))
pServerApp->simReportIO();
}
[...]
}
N'hésitez pas a me faire des suggestions.
Je vous remercie !
Aurélien