Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Windows > как закрыть бесхозную консоль


Автор: GremlinProg 1.11.2010, 12:52
Ситуация:

есть mpi-проект, который соответственно запускается через mpiexec,
в проекте, с учетом масштабирования задачи, создается некоторое число ролевых процессов: master, slave, terminal
каждый из процессов создает (в случае GUI) или имеет, свою консоль для интерактивного анализа ( отладки ) их взаимодействия

Проблема:

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

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

Вопрос:
Возможно ли как-то по человечески прибить эти консоли, либо предотвратить их такое отпочкование от процесса

ps: XP Professional 5.1.2600 SP3

Автор: GoldFinch 1.11.2010, 14:06
GremlinProg, приведи пожалуйста код, или бинарник воспроизводящий эту ситуацию.

Автор: GremlinProg 1.11.2010, 15:26
это коммерческий проект, так что ничего существенного не приведу,

для примера можно создать простую заготовку, типа:
Код

int _tmain( int argc, TCHAR*argv[], TCHAR*envp[] ){
  ...
  locale = _create_locale( LC_ALL, lpszLocale );
  ::SetConsoleOutputCP( locale->locinfo->lc_codepage );
  ...
  ::MPI_Init_thread( ..., MPI_THREAD_SERIALIZED ... );
  ...
  for( ... ; ... ; ... ){
    ...
    ::EnterCriticalSection( ... );
    ::SetConsoleTextAttribute( ... );
    ::WriteConsole( ... );
    ::LeaveCriticalSection( ... );
    ...
  }
  ::MPI_Finalize();
}

и покрутить ее немного с mpiexec в отладчике,
у меня обычно 2 слейва на 1 мастер + 1 клиент [клиент тоже имеет аналогичную консоль, но пускается за пределами mpiexec],
раз на раз не приходится, но хоть один-то в день точно бывает,
привязки к роли процесса нет ни какой, т.е. так может и простой клиент залипнуть

единственное, что задаю консоли - шрифт lucida и размеры окна,
здесь цикл - просто для примера, сами процессы, естественно многопоточные

среда разработки - 2008 студия

Автор: jonie 1.11.2010, 23:44
а у меня на работе (изрердка дома) такая же фигня .. притом без всяких MPI.. сдается мне это в XP-шке косяк где-то внутри .... посему предлагаю забить )

Автор: icecrashldr 2.11.2010, 11:40
GremlinProg
Это XP баг, здесь обычным отладчиком не обойтись(скорее всего только ядерным, студии точно не хватит) ... 
Это часто связано с планированием процессов, в APC бывает, много факторов на это играет, но честно говоря таки не было времени и особого желания продебажить эту багу ... 

П.С. А вот на семерки того не бывает ... 

Автор: xvr 2.11.2010, 12:21
Цитата(GremlinProg @  1.11.2010,  12:52 Найти цитируемый пост)
либо предотвратить их такое отпочкование от процесса
Написать баг репорт в MS. Вот только пошлют ведь ...   smile 



Автор: mihanik 2.11.2010, 13:11
GremlinProg, твою студию лучше на XP не использовать.
У неё проблемы с совместимостью.
Багов много.
Лучше переходи ли на Windows 7, или на другую студию. smile

Автор: GremlinProg 2.11.2010, 15:28
хотелось конечно малой кровью, т.к. ХР в виртуалке пока нет, а она нужна,
да и времени на смену оси тоже пока нет

Автор: Akina 2.11.2010, 16:18
Попробуй в качестве временного решения вручную давить их, используя, скажем, ProcessExplorer.


Автор: GremlinProg 2.11.2010, 19:10
судя по названию, ProcessExplorer оперирует процессами, (а процесса-то тут как раз и нет, он уже был убит, от него только консоль и осталась) или что?
посмотрю, конечно, как доберусь до нормального инета,
но если его смысл только в этом, то сразу - не поможет

Автор: Akina 2.11.2010, 19:17
Цитата(GremlinProg @  2.11.2010,  20:10 Найти цитируемый пост)
процесса-то тут как раз и нет, он уже был убит, от него только консоль и осталась

Ну да... процесса нет, а консоль святым духом на экране держится... раз висит - значит, процесс. Пусть и не тот, который ты запускал, а одна из его многочисленных дочек... причём даже оконный процесс...
PS. Может, я слишком вольно с терминологией...

Автор: leniviy 2.11.2010, 20:26
Это баг XP. У меня было такое же. Никак не прибить

Автор: mihanik 2.11.2010, 20:59
А прятать эти консоли никак?

cmdow нельзя использовать?

Автор: GremlinProg 3.11.2010, 07:20
Цитата(Akina @  2.11.2010,  21:17 Найти цитируемый пост)
Ну да... процесса нет, а консоль святым духом на экране держится

нет его, на самом деле нет
окно привязано к несуществующему пиду
Цитата(mihanik @  2.11.2010,  22:59 Найти цитируемый пост)
А прятать эти консоли никак? cmdow нельзя использовать?

это да - отличное решение, окно консоли скрыть получилось

Добавлено через 2 минуты и 42 секунды
Код

cmdow 0xYYYYYYYY /HID


0xYYYYYYYY - дескриптор окна, его можно спаем найти

Автор: GremlinProg 3.11.2010, 07:37
или без спая, но по заголовку (у меня там путь к исполняемому файлу),
т.е. одной командой можно скрыть сразу все бесхозные mpi окна

Добавлено через 12 минут и 29 секунд
можно просто бросить exe'шник вот на такой батник, чтобы не морочиться:
Код

C:\cmdow.exe %1 /HID

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)