КОРРЕКТНО завершить чужой процесс

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: КОРРЕКТНО завершить чужой процесс

Сообщение alibek » 26.11.2009 (Чт) 23:17

Ты не знаешь, что WM_?
Lasciate ogni speranza, voi ch'entrate.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: КОРРЕКТНО завершить чужой процесс

Сообщение SLIM » 26.11.2009 (Чт) 23:40

Вот ты!!!
Есть окно, у окна есть WinProc, который обрабатывает сообщения.
WinProc вызывает Disp.Mess. в цикле обработки сообщений. Если окна не видно, не значит что его нет.

Окно привязано к к какому-то потоку. Где-то в недрах WinProc стоит обработка сообщений WM_, где-то в ней (в обработке сообщения) написано что будет завершаться поток\процесс. WinProc привязан к окну, а не к потоку.

UPD:
Окон соответственно не всегда столько, сколько потоков. Это раз
WM_ - это Window Message, даже по названию понятно все
Пишите жизнь на чистовик.....переписать не удастся.....

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 26.11.2009 (Чт) 23:55

ну и что? Я перебираю потоки, шлю им WM_QUIT и проги спокойно завершаются. Я использую эту фишку для таких простых прог без окон, которые я раньше писал на Асме и пишут другие люди. Мне просто интересно, нормально ли будут завершаться проги с окнами по этому же методу, т.е. завершаться вообще без подвисов. Как показал тест, нормально. Я не знаю точную схему обработки сообщений на отрезке ПРОЦЕСС-ПОТОКИ-ОКНА, поэтому и интересуюсь.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 27.11.2009 (Пт) 0:10

Я просто думал, что посыл WM_QUIT по окнам приведёт к Unload Form, что будет несколько более корректным завершением, чем посыл WM_QUIT по потокам, однако, как показал тест, Блокнот завершается при получении WM_QUIT и наличии диалогового окна о сохранении данных с потерей данных. Поэтому я пока остановился на более универсальной процедуре посыла WM_QUIT потокам. Мне просто нужно 100% завершить прогу, но наиболее корректно.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: КОРРЕКТНО завершить чужой процесс

Сообщение SLIM » 27.11.2009 (Пт) 0:24

Space писал(а):ну и что? Я перебираю потоки, шлю им WM_QUIT и проги спокойно завершаются. Я использую эту фишку для таких простых прог без окон, которые я раньше писал на Асме и пишут другие люди. Мне просто интересно, нормально ли будут завершаться проги с окнами по этому же методу, т.е. завершаться вообще без подвисов. Как показал тест, нормально. Я не знаю точную схему обработки сообщений на отрезке ПРОЦЕСС-ПОТОКИ-ОКНА, поэтому и интересуюсь.

Ты прикалываешься? Я не знаю что ты там конкретно писал на асме, но у тебя явно неправильное понимание вопроса, раз ты так рассуждаешь.
Вот к примеру есть ф-я CreateThread - создает поток. Никакого нафиг окна она не создает.

Space писал(а):Я просто думал, что посыл WM_QUIT по окнам приведёт к Unload Form, что будет несколько более корректным завершением, чем посыл WM_QUIT по потокам, однако, как показал тест, Блокнот завершается при получении WM_QUIT и наличии диалогового окна о сохранении данных с потерей данных. Поэтому я пока остановился на более универсальной процедуре посыла WM_QUIT потокам. Мне просто нужно 100% завершить прогу, но наиболее корректно.


Ну это уже...
Unload Form не существует впринципе. Ты понимаешь что...хотя что тебе объяснять.
Хочешь я тебе накатаю приложение, которое ты не закроешь WM_QUIT?
Пишите жизнь на чистовик.....переписать не удастся.....

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 27.11.2009 (Пт) 0:46

я и сам могу такое накатать. Только зачем? Все нормальные приложения "понимают" WM_QUIT
может, WM_QUIT не приведёт к Form_QueryUnload, я не спорю. Сейчас проверим.
SLIM, это ты не понимаешь, что WM_QUIT существует не исключительно для окон. Оно попадает в процедуру обработки сообщений, и его обработка уже зависит от кода программера.
Последний раз редактировалось Space 27.11.2009 (Пт) 0:54, всего редактировалось 1 раз.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: КОРРЕКТНО завершить чужой процесс

Сообщение SLIM » 27.11.2009 (Пт) 0:53

Вот слов нет!!!
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Хакер » 27.11.2009 (Пт) 0:54

alibek не прав, Space прав. WM_QUIT это сообщение, предназначенное потоку, а не окну. До окон оно никогда не дойдёт, это сообщение, в отличие от всех остальных, не будет возвращено функцией GetMessage, не пройдёт трансляцию и диспетчеризацию. Вместо этого, оно приведёт к тому, что GetMessage вернёт 0, чем приведёт к прерыванию цикла обработки сообщений (и, в последствии, скорее всего, к завершению потока).

SLIM не прав, не WindowProc вызывает DispatchMessage, а наоборот. Но к WM_QUIT, как я сказал выше, это не относится.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: КОРРЕКТНО завершить чужой процесс

Сообщение SLIM » 27.11.2009 (Пт) 0:57

Хакер писал(а):SLIM не прав, ни WindowProc вызывает DispatchMessage, а неаоборот. Но к WM_QUIT, как я сказал выше, это не относится.

А я то и имел ввиду. Это просто смотря как прочитать
Пишите жизнь на чистовик.....переписать не удастся.....

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 27.11.2009 (Пт) 1:00

да, да Хакер! Получается, если послать WM_QUIT окну, его получит первым поток?! А окна закрываются, т.к. завершается вся прога, как при End в Бейсике? Или происходит при этом корректная выгрузка форм, как на Unload Me? Мабудь, нет.
Последний раз редактировалось Space 27.11.2009 (Пт) 1:04, всего редактировалось 2 раз(а).

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: КОРРЕКТНО завершить чужой процесс

Сообщение SLIM » 27.11.2009 (Пт) 1:02

Черт, ложанулся.
Приношу извинения. MSDN так и говорит.
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Хакер » 27.11.2009 (Пт) 1:15

Space писал(а):послать WM_QUIT окну, его получит первым поток?!

Я не знаю, что будет, если послать WM_QUIT окну. Никто не шлёт это сообщение окну, все юзают PostQuitMessage, которая просто помещает его в очередь сообщений потока. Наверное, если в очереди у этого сообщения будет корректный id, но левое значение поля hWnd, GetMessage всё равно его распознает как WM_QUIT, но это из оперы дури. Надо делать так, как сказано в MSDN, а там сказано так:
The WM_QUIT message is not associated with a window and therefore will never be received through a window's window procedure. It is retrieved only by the GetMessage or PeekMessage functions.

Do not post the WM_QUIT message using the PostMessage function; use PostQuitMessage.


А окна закрываются, т.к. завершается вся прога, как при End в Бейсике? Или происходит при этом корректная выгрузка форм, как на Unload Me? Мабудь, нет.

Во-первых, в WIndows нет форм. Во-вторых, WM_QUIT это просто Message-Paradigm-aware способ оборвать цикл, причём это кросс-поточный способ, что важно. Что происходит с окнами после цикла, зависит от разработчиков каждой отдельной программы. Скажу, что в 99% случаев ничего никто с окнами не делает.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 27.11.2009 (Пт) 2:12

ну если сравнить посыл потокам WM_QUIT и TerminateProcess - какова разница?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Хакер » 27.11.2009 (Пт) 2:26

Если сравнить естественную смерть и пулю в лоб, какова разница? В конечном исходе, никакой. В механизмах и сайд-эффектах, большая.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Antonariy » 27.11.2009 (Пт) 11:06

Я не знаю, что будет, если послать WM_QUIT окну.
Ничего не будет :)
Лучший способ понять что-то самому — объяснить это другому.

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 27.11.2009 (Пт) 12:28

будет завершение проги (проверено).

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 27.11.2009 (Пт) 12:35

В механизмах и сайд-эффектах, большая
О чём я тя и спрашиваю. Мне надо понять разницу, чтобы выявить преимущества и недостатки.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Хакер » 27.11.2009 (Пт) 13:31

Какие могут быть преимущества и недостатки у двух принципиально разных вещей?

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

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

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

Ни один из вариантов не является аналогом VB-шного End-а с принципиальной точки зрения..
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Antonariy » 27.11.2009 (Пт) 13:49

Space писал(а):будет завершение проги (проверено).
Окну или потоку Send или Post, определись. Потому что я проверял SendMessage hwnd, wm_quit. Ни-че-го.
Последний раз редактировалось Antonariy 27.11.2009 (Пт) 16:06, всего редактировалось 1 раз.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Хакер » 27.11.2009 (Пт) 14:18

Эмм... как минимум я бы Post юзал.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: КОРРЕКТНО завершить чужой процесс

Сообщение ANDLL » 27.11.2009 (Пт) 14:22

Код: Выделить всё
Потому что я проверял SendMessage hwnd, wm_quit. Ни-че-го.
А теперь PostMessage и то же самое. :roll:

WM_QUIT это документированный способ оповестить поток о том, что пора бы ему закончить крутиться в цикле обработки сообщений
Вообщето мне всегда казалось что это сообщение - документированный способ потоку из обработчкиа сообщений сообщить своему собственному циклу о том что надо завершаться. Иными словами - WM_QUIT вообще нужен только для использования внутри потока, а не для того что бы корректно чтото делать
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Space
Combo-маньяк
Combo-маньяк
 
Сообщения: 818
Зарегистрирован: 11.01.2007 (Чт) 1:19
Откуда: Украина

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Space » 27.11.2009 (Пт) 14:27

PostMessage hwnd, WM_QUIT, 0, 0 Проверял на блокноте, блокнот завершается.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Хакер » 27.11.2009 (Пт) 14:29

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

А я разве что-то другое сказал? Я так и сказал, что это Message-Paradigm-aware способ сказать своему циклу стоп. Не-Message-Paradigm-aware было бы, к примеру, юзание флага.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Antonariy » 27.11.2009 (Пт) 16:05

ANDLL писал(а):
Код: Выделить всё
Потому что я проверял SendMessage hwnd, wm_quit. Ни-че-го.
А теперь PostMessage и то же самое. :roll:
В этом случае сообщение ставится в очередь потока и до окна даже не доходит. А SendMessage непосредственно вызывает оконную процедуру, которая на WM_QUIT не реагирует.
Последний раз редактировалось Antonariy 27.11.2009 (Пт) 16:08, всего редактировалось 1 раз.
Лучший способ понять что-то самому — объяснить это другому.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: КОРРЕКТНО завершить чужой процесс

Сообщение ANDLL » 27.11.2009 (Пт) 16:07

А SendMessage оправляет сообщение непосредственно оконной процедуре, которая на него не реагирует.
Кто тебе такой идиотизм сказал? И ты ведь понимаешь что это идиотизм, потому что такого просто быть не может? Учитывая, что ты посылаешь сообщение в другой поток(что следует из условия топика, если ты не прочитал)?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Antonariy » 27.11.2009 (Пт) 16:10

MSDN писал(а):The SendMessage function sends the specified message to a window or windows. It calls the window procedure for the specified window and does not return until the window procedure has processed the message.
Еще будут идиотские вопросы?
Лучший способ понять что-то самому — объяснить это другому.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: КОРРЕКТНО завершить чужой процесс

Сообщение ANDLL » 27.11.2009 (Пт) 16:11

Даа.
Sucks to be you, если читая msdn ты заб(и)ываешь на процесс мышления
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: КОРРЕКТНО завершить чужой процесс

Сообщение ANDLL » 27.11.2009 (Пт) 16:14

Мне даже не удивительно, тебе ведь и в глову не приходить - КАК эта функция может совершить чудо вызова оконной процедуры между потоками.
И разумеется если бы тебе пришло в голову об этом задуматься, ты бы прочитал чуть дальше первого предложения и дошел бы до столь редко читаемой тобой секции remarks
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: КОРРЕКТНО завершить чужой процесс

Сообщение Antonariy » 27.11.2009 (Пт) 16:19

Упырьте мел, милейший, и ототрите монитор от брызг :)
Ну забыл про другой поток, с кем не бывает).
Лучший способ понять что-то самому — объяснить это другому.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: КОРРЕКТНО завершить чужой процесс

Сообщение ANDLL » 27.11.2009 (Пт) 16:22

С кем бывает, это другой вопрос
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Пред.След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 3

    TopList