Есть ехе и в нем 3 потока. Первый поток отрабатывает нормально, второй поток из-за некоторых особенностей может зависать. Третий нужен для того, чтобы отслеживать, зависает второй или нет. Вопрос, как отследить зависание второго потока из третьего, если время, за которое должен отработать второй поток - неизвестно? Т.е. WaitForSingleObject тут не прокатывает.
Решение в лоб - пускай поток перед началом выполнения ставит какую-нить переменную в false, после выполнения - true. По таймеру через каждые 100 мс проверять значение переменной. Если false - завис поток. ))
dyn пусть меняет иногда значение какой либо переменной, и поток смотри через периоды изменилась или нет. Ну это так в лоб. Можно тупо делать ++.
dyn Может так Код (Text): -ошибка Почитать про мютексы http://www.firststeps.ru/mfc/msdn/r.php?82 http://www.firststeps.ru/mfc/winapi/r.php?118
dyn А в чем он зависает, и каков критерий зависания? Если виснет в WaitForSingleObject, то можно сделать свой враппер, который будет вайтать в цикле, и если событие не произошло через N времени, то считать поток зависшим (например - выставить флаг в thread specific data, или как там ее).
_sheva740 Твой код просто ждет завершения работающего потока. Мютекс не освободится не только в случае зависания. Здесь просто нужно выяснить причины зависания в конкретном случае,или считать его зависшим при превышении некоторого максимального значения ожидания.
AndjellaArtavazdovna Да набузил я там что-то по наитию ))) Наверное так правильно Код (Text): #include <windows.h> #include <stdio.h> #include <time.h> #define WAIT_4_Proc2 3000L DWORD WINAPI TProc1(LPVOID data); DWORD WINAPI TProc2(LPVOID data); //------------------------------------------------------------------- int main() { DWORD dwtid; HANDLE pProcess1; DWORD dwWaitResult; pProcess1 = CreateThread(NULL,0,TProc1,NULL,0,&dwtid); // Ждем окончания первого прцесса dwWaitResult = WaitForSingleObject(pProcess1, -1); switch (dwWaitResult) { case WAIT_OBJECT_0: printf("- from [0]\t-\tWAIT_OBJECT_0\n"); break; case WAIT_TIMEOUT: printf("- from [0]\t-\tWAIT_TIMEOUT\n"); break; default: printf("- from [0]\t-\t????\n"); return 1; } return 0; } //--------------------------------------------------------------------- DWORD WINAPI TProc1(LPVOID data) { DWORD dwtid; HANDLE pProcess2; DWORD dwWaitResult; pProcess2 = CreateThread(NULL,0,TProc2,NULL,0,&dwtid); // Ждем окончания второго прцесса dwWaitResult = WaitForSingleObject(pProcess2, WAIN_4_Proc2); switch (dwWaitResult) { case WAIT_OBJECT_0: printf("- from [1]\t-\tWAIT_OBJECT_0\n"); break; case WAIT_TIMEOUT: printf("- from [1]\t-\tWAIT_TIMEOUT\n"); break; default: printf("- from [1]\t-\t????"); return 1; } return 0; } //--------------------------------------------------------------------- DWORD WINAPI TProc2(LPVOID data) { srand ( time(NULL) ); int sl = (rand()%10+1)*1000;// случ числа (1 ... 10) * 1000 printf("- from [2]\t-\t%d\n",sl);// получим задержку 1000 ... 9000 Sleep (sl); return 0; } Собирал в Dev С++, все работает. Еще интересно вот написано у Фролова об ожидании завершения нескольких задач или процессов http://www.frolov-lib.ru/books/bsp/v26/ch4_1.htm
_sheva740 Вот еще ,кстати,задача в этом топике сформулирована некорректно. Что понимает ТС под зависанием? Из-за каких особенностей? Может проще разобраться с этими самыми особенностями?
AndjellaArtavazdovna Ну да. Дак - всему есть предел))) Приделом его зависания пусть будет - WAIT_4_Proc2 )))