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: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
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