Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

Thread Kicker   Найти похожие ветки 

 
mrAld ©   (2005-05-05 18:33) [0]

Вопрос не новый: как определить, что мой поток (TThread) повис? Мож у кого-то был опыт при работе с ними, нужно как-то периодически "пинать" его, но как это сделать, если он молчит и что-то там себе думает?


 
Vladimyr ©   (2005-05-05 19:21) [1]

Сделай глобальный счётчик и увеличивай его в своём потоке.
А в другом - проверяй.

Если за определённое время изменений не было, - значит, завис.


 
alpet ©   (2005-05-05 20:26) [2]

Сделай в потоке обработку сообщений. Из другого отправляй сообщения SendMessageTimeOut, по результату возвращаемому функцией можно судить от завис поток или нет.

Особую подсказку дает параметр fuFlags этой функции:
SMTO_ABORTIFHUNG
Returns without waiting for the time-out period to elapse if the receiving thread appears to not respond or "hangs."


 
evvcom ©   (2005-05-06 09:27) [3]


> как определить, что мой поток (TThread) повис

Может лучше найти и исправить причину повисания?


 
Digitman ©   (2005-05-06 11:08) [4]


> что-то там себе думает


если так, то твой поток "висит" на некоем дурном цикле а-ля
while True do .. не допускай таких дурных циклов - и проблема будет решена

в ЛЮБОМ противном случае поток ничего не "думает" - он либо "спит" (ты приказал ему Suspend, т.е. "спать до особых распоряжений"), либо он, вызвав одну из Wait-ф-ций WinAPI, ожидает от ядра ОС "указаний" двигаться дальше


 
tesseract   (2005-05-07 16:11) [5]

> как определить, что мой поток (TThread) повис
Используй try..except и логи в начале любых / функций циклов. Так можешь реально посмотреть ГДЕ этот гад застопорился. Я просто написал класс который этим и занимается.
И чем именно он реально занимается можешь просмотреть ProcessExplorer - он показывает ресурсы захваченные процессом.


 
GrayFace ©   (2005-05-07 18:39) [6]

Digitman ©   (06.05.05 11:08) [4]
если так, то твой поток "висит" на некоем дурном цикле а-ля
while True do .. не допускай таких дурных циклов - и проблема будет решена

А что плохого в таких "дурных" циклах? Вероятность зацикливания такая же, как у while с условием.
( ИМХО, конечно. Но абсолютно верное и, скорее всего, непоколебимое ИМХО! :)


 
Германн ©   (2005-05-08 03:04) [7]

2 GrayFace ©   (07.05.05 18:39) [6]
>А что плохого в таких "дурных" циклах?

Плохого в них то, что автор должен быть полностью уверен, что его код всегда, при любых условиях предусматривает выход из цикла. А кто из нас может всегда быть уверен?

Я тоже очень часто бывало грешил этим, но то было в Досовском ТР. А в Дельфи есть много других способов.


 
GrayFace ©   (2005-05-10 14:44) [8]

Германн ©   (08.05.05 3:04) [7]

Чем, например, такой код:
while true do
begin
 if усл then break;
 ...
end;


опаснее такого:
while усл do
begin
 ...
end;

(громоздкость не в счет)


 
Германн ©   (2005-05-11 02:22) [9]

2 GrayFace ©   (10.05.05 14:44) [8]
>Германн ©   (08.05.05 3:04) [7]

>Чем, например, такой код:
>while true do
>begin
> if усл then break;
> ...
>end;

>опаснее такого:
>while усл do
>begin
> ...
>end;
>(громоздкость не в счет)

Ну хотя бы тем, что он менее удобночитаем!
Начало цикла и конец цикла мы легко находим, если автор придерживается неких общеизвестных правил.
А вот поиск проверки и выполнения условий выхода из цикла внутри него - это, в общем случае - весьма не слабая задача.


 
GrayFace ©   (2005-05-11 16:48) [10]

Вот приближенный к реальности пример:
функция для чтения такого файла:
свойство=
значение
свойство=
значение


Вот какой можно сделать код:
while not eof do
begin
  ReadLn(props[i]);
  if eof then break;
  ReadLn(values[i]);
  // убераем "="
  SetLength(props,length(props)+1);
  SetLength(values,length(values)+1);
end;
SetLength(props, length(props)-1);
SetLength(values, length(values)-1);

Break внутри - явная "дурность".
Вопрос: как это сделать без break и будет ли это лучше?


 
alpet ©   (2005-05-11 16:57) [11]


var flag: bool;
begin
flag := not eof (f);
while flag do
begin
 ReadLn(f, props[i]);
 flag := flag and (not eof (f));
 if flag then ReadLn(f, values[i]);
 flag := flag and (not eof (f));
 // убераем "="
 SetLength(props,length(props)+1);
 SetLength(values,length(values)+1);
end;
SetLength(props, length(props)-1);
SetLength(values, length(values)-1);
end;


 
begin...end ©   (2005-05-11 17:24) [12]

> GrayFace ©   (11.05.05 16:48) [10]

> Break внутри - явная "дурность".

Кто сказал, что Break -- это дурность?

> Вопрос: как это сделать без break

while not EOF(...) do
begin
 ReadLn(Props[I]);
 if not EOF(...) then
 begin

   ReadLn(Values[I]);
   ...
 end
end


> и будет ли это лучше?

В данном случае (именно для этого кода) -- думаю, что будет лучше.

Вообще же здесь лучше, ИМХО, было бы возбуждать исключение, т.к. если после прочтения очередного элемента Props нет соответствующего элемента Values, то файл (или откуда там это читается) имеет неправильный формат.


 
GrayFace ©   (2005-05-12 19:34) [13]

Да, [12] выглядит достаточно красиво. Даже лучше. Но добавляется лишний begin...end. Каламбур вышел :) . Иногда нагромождение begin..end-ов значительно затрудняет правку кода. Поэтому, обычно я предпочитаю break-и и exit-ы, и не понимаю тех, кто против них.

begin...end ©   (11.05.05 17:24) [12]
Кто сказал, что Break -- это дурность?

Тут похожий вопрос. Хотя есть одно но - с ситуациями, когда чистый while true do хоть как-то полезен я не встречался и, врядли, встречусь. Но я утверждаю одно - while с условием, while без условия - один черт. Разница только в красоте, а не в ошибкоустойчивости.

begin...end ©   (11.05.05 17:24) [12]
Вообще же здесь лучше, ИМХО, было бы возбуждать исключение, т.к. если после прочтения очередного элемента Props нет соответствующего элемента Values, то файл (или откуда там это читается) имеет неправильный формат.

Это просто пример из головы.


 
Германн ©   (2005-05-13 02:44) [14]

2 GrayFace ©   (12.05.05 19:34) [13]
>Да, [12] выглядит достаточно красиво. Даже лучше. Но >добавляется лишний begin...end. Каламбур вышел :) . Иногда >нагромождение begin..end-ов значительно затрудняет правку кода. >Поэтому, обычно я предпочитаю break-и и exit-ы, и не понимаю >тех, кто против них.

А кто тут против их? (Рука, по привычке, тянется к поясной кобуре!) Тут же вспоминается "Обратно в будущее", причем все три фильма (Кстати очень хорошие. Спилберг и Зимейкис хорошо поработали!)

Могу представить десятки своих функций, гле используются Break и Continue.


 
cerber   (2005-05-13 22:48) [15]

Не буду оригинален


MBo ©   (04.03.03 08:18)
...

9X - IsHungThread (ThreadId: Thandle): BOOL;
NT, 2K - IsHungAppWindow (Wnd: THandle): BOOL;



взято из стааааарого форума


 
Германн ©   (2005-05-14 01:08) [16]

cerber   (13.05.05 22:48) [15]
А это что за приблуда?

Гей модераторы! Удалите сей топик, как ошибочно возникший в данной ветке.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.042 c
14-1118041265
Кабан
2005-06-06 11:01
2005.07.11
Цифровые фильтры


3-1117687243
john_mag
2005-06-02 08:40
2005.07.11
обработчик MouseToCall


14-1117902396
Pat
2005-06-04 20:26
2005.07.11
Кандидатский минимум. Философия


1-1119514595
polariton2
2005-06-23 12:16
2005.07.11
Картинки в шапке StringGrid


14-1118329934
Soft
2005-06-09 19:12
2005.07.11
Исполнитель желаний.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский