![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Умирающий поток. [D7, Win2k]
debuger © (2005-07-15 20:47:00)Доброго времени суток
Есть следжующая ситуация: имеется некий общий ресурс, и несколько потоков, которые к нему доступаются(использую критические секции). Но некий не поддающийся прослеживанию(т.е. спонтанно для меня лично) момент времени один из потоков пересает обращаться к ресурсу вообще, т.е. создается впечатление что он термнэйтнулся за моей спиной, причем без каких либо исключений. Может ли такое быть и как это лечить.
debuger (2005-07-22 16:11:00) [1]Спасибо всем.
debuger (2005-07-22 16:11:00) [2]Спасибо всем.
Alexander Panov (2005-07-18 10:30:00) [3]debuger © (17.07.05 11:43) [5]
Помжет ли мне то, что содержимое цикла я оберну в try..except?
Поможет несомненно - не будет произвольного выхода из функции потока.
Кроме того, вначале цикла тоже желательно проверять флаг Terminated.
Digitman (2005-07-18 10:22:00) [4]
> Помжет ли мне то, что содержимое цикла я оберну в try..except?
хуже уж точно не будет
по кр.мере, если искл-е таки возникает, ты сможешь записать инф-цию о нем в протокол для послед.анализа
есть еще предположение, что где-то в телах вызываемых в теле Execute() п/программ ты "гадишь" поле TThread.FTerminated, что вполне может привести к "досрочному" выходу из цикла
debuger (2005-07-17 11:43:00) [5]основное тело потока примерно следующее:
repeat
tickCount := GetTickCount;
GetDeviceInf; // читаем с девайса инфу, это и есть общий ресурс, внутри самой процедуры и используются критические секции
Synchronize(UpDate); //выод результатов
tickCount := GetTickCount - tickCount;
if tickCount < idleTime then
Delay(idleTime - tickCount); // Delay - по сути некое подобие того, что еть в RxLib.
until terminated;
Помжет ли мне то, что содержимое цикла я оберну в try..except?
debuger (2005-07-16 16:33:00) [6]2: вроде как завершился, я через WaitFor его дожидаюсь при завершении, сразу же срабатывает, если бы он залип был, то вряд ли бы я его так быстро дождался.
3: поток создавался как TThread.Create
К тому же глюк очень редкий и отследить его практически невозможно, тем более у меня по месту дизайна не глючило ни что, глючит уже у заказчика.
Alex Konshin (2005-07-15 22:34:00) [7]Исключение вполне могло быть, только ты его не отловил в потоке.
Как создавался поток?
begin...end (2005-07-15 20:56:00) [8]> debuger © (15.07.05 20:47)
> один из потоков пересает обращаться к ресурсу вообще,
> т.е. создается впечатление что он термнэйтнулся за
> моей спиной
Действительно ли он завершился? Что возвращает в этой ситуации WaitForSingleObject (с параметром dwMilliseconds = 0)?
Mx (2005-07-15 20:53:00) [9]Надо бы инфы побольше