![>](style_images/1/nav_m.gif)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.12.36.147] |
![]() |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Спасибо всем, высказавшим свое мнение.
Поясню, почему я всем этим озадачился: 1. На разработчиков MyHeavyTask.exe повлиять нельзя. На разработчиков интерпретатора железки тоже повлиять нельзя. Людей там мало, научные задачи стоят перед ними сложные. Работаю по-старинке. А так минимум, чего бы хотелось, - при консольном запуске программы не заюзывать графику. 2. Почему важно идеально отслеживать работу программы? Просто мы собираем статистику (одна из наших задач) и часто оставляем расчеты, скажем, на ночь. Вот и хочется избежать ситуации, когда вечером запустил на счет, например, 200 циклов программы (поочередно, с разными начальными данными), а утром вместо посчитанных 200 программ с разными начальными данными обнаруживаешь зависон на, например, 10-м шаге цикла запуска MyHeavyTask.exe P.S. По результатам своих изысканий отпишусь позже. Идея с FindWindow кажется перспективной! |
Сообщ.
#17
,
|
|
|
Цитата mkudritsky @ 2. Почему важно идеально отслеживать работу программы? Просто мы собираем статистику (одна из наших задач) и часто оставляем расчеты, скажем, на ночь. Поэтому, крайне перспективно убедить других разработчиков внести некоторые изменения в дочерние приложения. Например, регулярную посылку сообщений твоему (управляющему) приложению. В этом случае можно было бы делать однозначный вывод о зависании приложений. После этого: 1. Управляющее приложение снимает дочерние процессы. 2. Выясняет объём выполненной работы. 3. Запускает дочерние приложения на продолжение выполнения. Тогда ночь не будет потрачена напрасно. ![]() |
Сообщ.
#18
,
|
|
|
Как и обещал, излагаю прием, при помощи которого я сейчас закрываю интерпретатор.
Напомню - интерпретатор запускается тяжелой задачей MyHeavyTask.exe Но после ее завершения остается открытым. Закрывается интерпретатор кодом в одну (!) строчку: ![]() ![]() SendMessage(FindWindow("TInt","Имя окна интерпретатора"), WM_DESTROY,0,0); Для работы этого фрагмента кода надо знать: 1. Наименование окна интерпретатора. Это узнать очень просто - достаточно посмотреть на самую верхнюю строчку этого окна. ![]() 2. Класс, к которому принадлежит интерпретатор. Этот параметр узнать сложнее. Делается такое при помощи утилиты, входящей в комплект Билдера: Program Files\Borland\CBuilder6\Bin\ws32.exe 3. Наконец, закрывать окно при массовых расчетах надо при помощи именно WM_DESTROY - тогда оно закрывается без лишних разговоров и бесед с пользователем. Если закрывать окно при помощи WM_CLOSE, то в нашем случае интерпретатор норовит побеседовать с пользователем (типа "Вы уверены, что хотите меня закрыть?!"). И ответить на эти вопросы интерпретатора не представляется возможным, если расчеты оставлены на ночь. P.S. Ну и последнее - обо всем этом, как оказалось, написано в той же самой книге Архангельского по Билдеру (часть 1). |