Oppure

Loading
25/03/10 15:57
robrock80
Ho risolto in un'altra maniera: ho utilizzato un evento al posto del mutex, ma a questo punto mi riamene un dubbio: ma la wait sul mutex ha effetto solo sui thread creati con CreateThread o funziona anche per il thread principale del processo?
aaa
25/03/10 16:10
TheKaneB
funziona su qualunque thread, senza distinzione ;)
aaa
25/03/10 16:50
robrock80
Boh, è assurdo... Perchè lì la wait non funziona e invece con l'event scritto alla stessa maniera (cambia sola la release) non funziona? Dipenderà dal compilatore (io uso mingw)?
aaa
25/03/10 16:55
TheKaneB
event e mutex sono diversi.
Un mutex blocca tutte le wait successive alla prima, e una release sblocca una sola delle wait.
Un event blocca tutte le wait a prescindere, e una singola release sblocca TUTTE le wait.
aaa
25/03/10 16:57
robrock80
No... Mi sono sbagliato, non funziona neanche con l'event... Che tristezza :d
Ultima modifica effettuata da robrock80 25/03/10 17:03
aaa
25/03/10 17:08
TheKaneB
ancora non ho capito perchè vuoi bloccare il thread padre...

i mutex servono a proteggere le risorse condivise, non a bloccare i thread in modo arbitrario.
aaa
25/03/10 20:52
robrock80
Eurekaaaaa... Ci sono riuscito!!! Per questo tipo di problema serviva un event e comunque c'era un problema quando lanciavo la funzione di rilascio: praticamente anzichè deferenziare il puntatore gli passavo il puntatore stesso
void sendAsynchronousMessage(TCHAR title[], TCHAR text[], int type) {
	int sendMess(Params*);
	DWORD dwThreadId;
	HANDLE event = CreateEvent(NULL, TRUE, FALSE, NULL);
	Params params = {{(TCHAR*)title,(TCHAR*)text, &type, &event}};
	CreateThread(
					NULL,						0,		
					(LPTHREAD_START_ROUTINE)&sendMess,
					¶ms,
					0,		
					&dwThreadId);
	WaitForSingleObject(event, INFINITE);
}


int sendMess(Params *params) {
	HANDLE* event = (HANDLE*)params->param[3];
	TCHAR* title = (TCHAR*)malloc(sizeof(TCHAR) * _tcslen((TCHAR*)params->param[0]));
	_tcscpy(title,(TCHAR*)params->param[0]);
	TCHAR* message = (TCHAR*)malloc(sizeof(TCHAR) * _tcslen((TCHAR*)params->param[1]));
	_tcscpy(message,(TCHAR*)params->param[1]);
	int ico = *(int*)params->param[2];
	if (event != 0) {
		PulseEvent(*event);
	}
	int res = MessageBox( NULL, message, title, ico);
	free(title);
	free(message);
	return res;
}
Ultima modifica effettuata da robrock80 25/03/10 21:08
aaa
25/03/10 22:52
TheKaneB
:D non mi ero accorto dell'errore sul puntatore!
aaa