Показать сообщение отдельно

  #3  
Старый 12.03.2009, 15:00
0x0c0de
Постоянный
Регистрация: 25.05.2007
Сообщений: 448
С нами: 9981026

Репутация: 1564
По умолчанию

Цитата:
Сообщение от _nic  
Я правильно понимаю что поток из которого будет производится проверка "замерзнет" до окончания работы проверяемого потока?Чем тогда это отличается от синхронизации через мутекс?Мне нельзя замораживать этот поток
Смотрим прототип

Код:
DWORD WINAPI WaitForSingleObject(
  __in  HANDLE hHandle,
  __in  DWORD dwMilliseconds
);
Я же написала, что если вы поставите второй параметр INFINITE, то да, управление WaitForSingleObject вернет только после завершения работы потока. Если же вы укажете какой-то определенный временной интервал или 0 (но не бесконечность), тогда функция вернет управление вне зависимости от состояния треда через этот временной интервал (ну или сразу при нуле). Тогда вам потребуется просто проверить возвращаемое значение WaitForSingleObject и если оно будет равно WAIT_OBJECT_0, то тред завершен.

И с мьютексами, семафорами, эвентами, хендлами процессов принцип тот же. Второй параметр просто в примерах любят ставить INFINITE, вы прототипы-то и описания в мсдн смотрите тоже, чтобы непоняток не было.

вот пример

Код:
VOID StartRoutine(VOID)
{
	int i;
	for(i = 0;i<10;i++)
	{
		printf("I am in thread: count  %d\n",i);

	Sleep(100);
	}
}


int _tmain(int argc, _TCHAR* argv[])
{

	DWORD dwStatus,dwTid;

	HANDLE hThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)&StartRoutine,0,0,&dwTid);

	do
	{
		dwStatus =  WaitForSingleObject(hThread,0);

		printf("Status = %X\n",dwStatus);
	 
		Sleep(100);

	}while(dwStatus !=WAIT_OBJECT_0);

	Sleep(-1);
	return 0;
}
Как видите, WaitForSingleObject вызывается с тайм-аутом 0. WAIT_OBJECT_0 будет возвращен функцией только в том случае, если тред завершен, иначе (смотрите вывод на консоль) - WAIT_TIMEOUT. И, конечно же, заморозки проверяющего треда нет. Вот такие дела.

Последний раз редактировалось 0x0c0de; 12.03.2009 в 15:37..
 
Ответить с цитированием