Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: как из одного thread-а определить, где сейчас находится второй thread (line num)  (Прочитано 3387 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« : 26-04-2010 14:10 » 

Есть 2 thread-а: основной и наблюдающий (например, watchdog - thread).
можно ли из watchdog - thread-а найти line number, на котором сейчас находится основной thread?
Т.е изначально вопрос: реально ли это более-менее доступными средствами? Если да, то как?
Т.е. что-то типа thread.getLineNumber() ?
Записан

холоднокровней, Маня, Ви не на работе
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 26-04-2010 15:19 » 

По-моему, в чистом виде применительно к C++ - только в debug-сборке, если создать среду исполнения, как у отладчика.

В приближении можно раскидать по коду наблюдаемого потока некие контрольные точки трассировки, из которых сообщать наблюдающему потоку, что наблюдаемый прошёл такую-то контрольную точку. Но такое решение имеет очевидные недостатки: дополнительные вызовы, невозможность применить watchdog к любому коду, необходимость вводить у программистов дисциплину указания контрольных точек.

Применительно к .NET... я лично не знаю, но подозреваю, что в пространствах имён System.Reflection и System.Diagnostics что-то полезное найдётся.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #2 : 27-04-2010 02:30 » 

Malaja, а зачем?
обычно делают наоборот, т.е. один сообщает другому о прохождении контрольных точек.
Записан

Странно всё это....
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #3 : 27-04-2010 08:25 » 

Ребята,
опять же поиск красоты и легких путей погубит меня ранъше времени Отлично
Не хотелось особо менять код, но при этом хотелось следить за процессом постоянно.
Т.е. вводить контрольные точки в дополнение к имеющимся тоже не хотелось.
Появилась идея - в watchdog-е кажные n-секунд проверять строку кода: если она изменилась, то процесс живет, а если нет - висит.
Но похоже, что это если и реализуемо, то с дикими плясками с бубном вокруг костра.  Жаль А это уже не имеет смысла, т.к. вносит дополнительные сложности в программу (а она и так простотой не страдает).
System.Reflection и System.Diagnostics прошерстила, но пока ничего правильного не нашла...
Diagnostics.StackTrace дает возможность определить строку, но в таком контексте, как мне надо.
Reflection вообще, насколько я понимаю, дает общую инфу, а не текущую (т.е. общий обзор класса со всеми потрохами, но не текущую строку в процессе выполнения).
Думала, может что-то в System.Threading.Thread спрятано, но тоже пока не нашла.
Записан

холоднокровней, Маня, Ви не на работе
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 27-04-2010 09:41 » 

Malaja, мысль правильная - отслеживать чужой процесс. Но это тебе выльется в серьезный программный код. Чуть ли не на уровне дебагера.
Или же тесты должны использовать глобальные переменные, доступные для WD.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #5 : 27-04-2010 10:10 » 

Слав,
вот то-то и оно - эти сложности мне явно ни к чему.
А что мне дадут глобальные переменные?
Записан

холоднокровней, Маня, Ви не на работе
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #6 : 27-04-2010 10:15 » 

Можно попробовать через определенные интервалы времени делать:
1. SuspendThread
2. GetThreadContext
3. Сравнить контекст потока с предыдущим состоянием - если одинаковые, значит поток стоит
4. ResumeThread
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 27-04-2010 10:56 » 

Код:
+----------------------+
| область              |
| глобальных пременных |
+--^---------^---------+
   |         |
   |         |
+-------+ +--V---+
| test  | |  WD  |
+-------+ +------+
как-то так
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 27-04-2010 12:03 » 

Цитата: Malaja
Появилась идея - в watchdog-е кажные n-секунд проверять строку кода: если она изменилась, то процесс живет, а если нет - висит.
"Висит" с точки зрения программиста - это не подаёт признаков жизни, не откликается, не завершается. С точки зрения среды исполнения же он не висит, а работает: либо долго что-то делает, либо зациклился намертво. Но если "висящий" процесс бегает по циклу, то строки кода, естественно, будут меняться внутри цикла.

Поэтому такая идея в чистом виде бесполезна. А городить статистику выполнения разных строк - придётся много-много и хорошо думать, только в добавок к собственному аналогу debugger'а ещё придётся писать и собственный аналог profiler'а. Улыбаюсь Не советую.

Самое простое и очевидное - отвести лимит времени. Зачем сложнее? Кому что это даст (с прагматической точки зрения, отбросив всякие перфекционистские стремления к "точности" ради неё самой)?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 27-04-2010 12:21 » 

А если честно, то я вобще не понял, как будет меняться "строка кода" и как это можно отследить? Ведь в запущеном приложении нет уже никакого изначального кода. Или?

Ир, а всё-таки, что надо установить? Что процесс "живёт/висит" (смотри димкино объяснение в #8) или же что он выполняет определённую осмысленную работу?
« Последнее редактирование: 27-04-2010 12:30 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #10 : 27-04-2010 12:30 » 

Слав,
я понимаю, зачем глобальные переменные, но не понимаю, что они мне дадут.
Их опять же надо периодически устанавливать, а это означает сусщественное изменение кода.

Дим,
я уже поняла, что это слишком сложно и посему в данном случае себя вообще не оправдывает.

zubr,
спасибо за идею - сейчас быстро попробую встроить и посмотрю на результат.

Джон,
надо определить, что он не завис.
Зациклится он может вряд ли, а вот deadlock - запросто (там сплошь и рядом синхронизация).

Короче говоря, я уже поняла, что идея со строками кода бессмысленная.
Пойду наиболее простым путем - как написано в посте про watchdog.
Записан

холоднокровней, Маня, Ви не на работе
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines