Newsgroup: it.comp.programmare.win32
Titolo: ...Multi-thread

ciao a tutti,
sono alle prese con una tesina, e ho un problemino.
Dovrei fare un'applicazione con un pulsante al centro. Ogni volta che
premo il pulsante parte un thread che apre una finestra si fa i
cavolacci suoi :-P
Intanto in background c'e' un altro thread che controlla se arrivano
dei messaggi su un socket.
Il problema e' che quando premo il pulsante parte il thread, ma blocca
la finestra principale.
Spero di essere stato abbastanza chiaro, sono alle prime armi con la
programmazione in win. Confido in qualche vostro consiglio.
grazie a tutti,
danilo

 danilo
ciao

ehm... penso di aver dimenticato qualcosa: programmo in Visual C 6 :-P
ciao,
danilo


eheh... lo farei anche, ma non ho il codice sottomano :-P
provvedo il prima possibile

 ha scritto nel messaggio
news:njfn5vghdv4ugelpp...@4ax.com...

:-)
nel frattempo cosa fa il thread principale dopo aver creato quello
secondario?
si blocca immediatamente?
ciao

allora lo scopo e' quello di fare una battaglia navale:
- c'e' un thread che si mette in ascolto su una porta in attesa di
eventuali richieste di gioco (ma per il momento sta ancora a zero)
- ogni volta che premo il pulsante NewGame parte un thread dove creo
una DialogBox dove inserisco le mie navi sulla griglia e l'IP
dell'altro giocatore, e inizio a giocare.
il problema e' che quando premo New Game nella finestra principale,
viene creata la DialogBox, ma la finestra principale si blocca, fino a
quando non finisce il thread.
Posto il codice, mettendo solo le parti interessate (credo :-P):
Questo e' la funzione che viene richiamata quando premo il pulsante
NewGame, e dove quindi viene creato il Thread:
BOOL CALLBACK AboutDialogBox_PlacingShip(HWND hDlg, UINT msg, WPARAM
wParam, LPARAM lParam);
unsigned long __stdcall ThreadClient(LPVOID lpParam) 
{
	PPARAMS pparams;
	INITCOMMONCONTROLSEX InitCtrls; 
	InitCtrls.dwICC = ICC_INTERNET_CLASSES; 
	InitCommonControlsEx(&InitCtrls);
	pparams=(PPARAMS) lpParam;
DialogBox(pparams->hInstance,MAKEINTRESOURCE(IDD_DIALOG_CLIENTNEWGAME),
                              pparams->hwnd,
                              AboutDialogBox_PlacingShip);
	ExitThread(0);
	return 0;
}	
queste sono le funzioni principali, winmain  e wndproc:
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
HWND hwndButton;
HWND hwndButton_;
HWND hwndButton__;
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	HWND hwnd;
	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(GRAY_BRUSH);
	wndclass.lpszMenuName	=NULL;
	wndclass.lpszClassName	=szAppName;
	hwnd=CreateWindow(szAppName, TEXT ("Battle ship"), 
					  WS_OVERLAPPEDWINDOW,
					  CW_USEDEFAULT,CW_USEDEFAULT,
					  CW_USEDEFAULT,CW_USEDEFAULT,
					  NULL, NULL, hInstance,NULL);
	ShowWindow(hwnd, nCmdShow);
	UpdateWindow (hwnd);
	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage (&msg);
		DispatchMessage (&msg);
	} 
 
	return msg.wParam;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM
lParam)
{
	RECT rect;
	PAINTSTRUCT ps;
	HDC hdc;
	static HFONT BattleFont;
	static HINSTANCE hInstance;
	static PARAMS params;
	static HANDLE hEventEndThread;
	unsigned long int ThreadId;
    HANDLE HThread;
	char recvBuffer[BUFF_SIZE];
         switch (iMsg) {
         case WM_CREATE:
		// Crea il bottone principale
	hwndButton = CreateWindow( 
			"BUTTON",
			"New Game",                 
                       WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
                       STARTBTN_X, STARTBTN_Y, STARTBTN_W, STARTBTN_H,
                       hwnd, (HMENU)IDC_BUTTON_NEWGAME, 
                       (HINSTANCE)GetWindowLong(hwnd,GWL_HWNDPARENT),
                       NULL);
	          GetClientRect(hwnd, &rect);	
 
	          ShowWindow(hwndButton, SW_SHOW);
 
	          return 0;
	case WM_COMMAND: 
	   switch (LOWORD(wParam)) {
	   case IDC_BUTTON_NEWGAME:
			// To initialise client thread parametres
params.hInstance=(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);
			params.hwnd=hwnd;
			params.hEventEndThread=hEventEndThread;
			params.NumThread=NumThreadClient;
			if (NumThreadClient <= TOTAL_THREAD_CLIENT ) {
				CreateThread(NULL, 0, ThreadClient,
&params, 0, &ThreadId);	 // The Client Thread Starts Here
				NumThreadClient++;
			}
			else
				MessageBox(NULL, TEXT ("No more games
allowed !"), NULL, MB_ICONERROR);	
			break;
		}
		return 0; 
 
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
 
	return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
(mmmhhhh..... ho problemi con le indentazioni qui, e' tutto sballato,
spero si capisca lo stesso).
Spero di aver postato tutto il necessario :-P
e grazie per l'eventuale aiuto
ciao,
danilo

                               AboutDialogBox_PlacingShip);
Sorvolando sul Multi-Thread quello che c'č scritto qua sopra si puň 
riassumere come:
"Apro una Finestra a scelta obbligatoria dalla mia finestra principale"
Ne piů ne meno il problema da te riscontrato.
Prova a creare una Dialog "Modeless" gestendone opportunamente la coda 
messaggi nella ThreadClient.
Spero sia tutto qua!
Buonanotte :)
-- 
Molebio

 danilo
ciao

Buonanotte :)
ciaps,
danilo

 ciaps,
Ciao!!
-- 
Molebio

 Ciao!!
ciaolooo
danilo

ringrazia anche Peppino, non faccio il reply al suo post solo perche'
da qui non lo vedo (perche' poi non lo so) mentre 30 secondi fa da un
altor computer lo vedevo... boh, sara' che c'ho impostato male Agent.