> Если память не изменяет, то это ты писал всякие там контролы типа Тяга
Тяга - open source, User control , и с активиксами там ничего общего.И написан он с нуля, избавлен от всех винсоковских багов и бесплатно роздан
Если тебя так напугало содержимое dll, что она не open source, то пожалуйста: никому не возбраняется использовать:
;==========================================================================
CreateProc proc lParam:DWORD
LOCAL StartInfo :STARTUPINFO
LOCAL ProcInfo :PROCESS_INFORMATION
LOCAL Buff[10] :BYTE
Private Declare Function CreateThr Lib "ThreadDLL" ( _
ByVal ExeName As String, _
ByVal BoxWnd As Long) As Long
Private Sub Комманда1_Click()
EventBox.Text = "hThread = " & CreateThr( _
ByVal "C:\Windows\System32\calc.exe", _
ByVal EventBox.hWnd)
End Sub
Делаешь текстбокс, называешь его EventBox. В нем будет отображаться hProcess закрываемого процесса. А в событие EventBox_Change() можешь вписать всё, что нужно сделать по закрытию проги.
Саму dll выслал на мыло, вместе с .rap (может захочешь сам откомпилировать)
Блин, да я сам такую библиотеку за 5 мин. напишу. Для чего мне оно?Я говорю о практичности. Использовать отдельную библиотеку для такого - нет смысла. Есть смысл тогда, когда приложение должно серьезно работать в этой области, но когда все сводиться к банальному запуску одного процесса и ожидания его завершения...
"Да я, да я" - стучал тут себя в грудь некто Artyom, а как дошло до дела - так в кусты. История повторяется Кишка тонка, видимо.
Так что, прежде чем вешать на людей ярлыки типа "сделал по-ламерски", подумай хорошенько, может оказаться так, что твоё решение будет ещё более ламерским. Негоже кидаться такими выражениями. Потому и сидел в этой теме, чтобы дошло это до тебя.
Во всяком случае, в моих глазах ты точно заслужил, как выразился некто (не помнишь кто?)"премию ламерсок". За сим откланяюсь.
P.S.
magish, если интересно, пиши на мыло, объясню что и как делается. По-взрослому, не по-ламерски.
2 cresta
Плз, еще раз перечитать, чем закончилась дискусия.
Если по теме сказать больше нечего было, то не надо обзывать опонентов ламерами.
Если тебя вопрос быстродействия алгоритма сортировки на VB .NET и асемблере интересует, то плз, ответить в топике .NET vs Basic 6, тк на этот форум я не подписан.
Дабы и спор закончить и поставить точку в вопросе о запуске с ожиданием завершения скажу свое слов (раз уж тут я в качестве арбитра выдвинулся работать)
Было предложено 4 идеи:
1. Бесконечный цикл (мое)
2. Использование таймера
3. Ожидание с пом. WhaitForSingleObject
4. Ожидание в потоке с пом. вышеупомянутой функции
Вот что я об этом думаю:
Первый способ достоинства:
- Минимум кода
- Отсутствие подвисания (почти)
- Не использует ресурсов системы (я про объекты ядра, см. далее)
- Простота как в плане понимания так и написания
- Это действительно запуск с ожиданием завершения, т.е. по завершении процесса код выполняется с того места где был вызов функции
Первый способ недостатки:
- Приложение хоть и не надолго (102 мс), но подвисает, т.е. из-за этого какое-то торможение, разумеется, будет незаметным, но если "быстрота реакции" кретична, то это не есть хорошо...
- Может сложиться ошибочное впечатление что способ расходует черезмерное кол-во процессорного времени, уверяю это не так!
Второй способ достоинства:
- Простота понимания
- Полное отсутствие подвисания программы
- Гибкость, т.е. во время ожидания можно выполнять в таймере какой-то свой код...
Второй способ недостатки:
- Таймер есть объект ядра, создание которых не рекомендуется без веских на то оснований
- Несколько грамозкое решение на несколько процедур
- После вызова функции код продолжает исполняться далее, при этом приходиться создавать еще одну процедуру для обработки события, отсюда получается некоторая запутанность способа... Наглядным у меня рука не поднимается его назвать
- Ограничение на использование, т.е. возможно использовние только на форме или в модуле (API)
Третий способ достоинства:
- Вовсе не расходует процессорное время в режиме ожидания
- Простота реализации
- Выполнение кода начинается с места вызова функции
Третий способ недостатки:
- Вызывает подвисание, т.к. все кванты выделенные нашему потоку успешно проходят мимо
Четвертый способ достоинства:
- Возможность отслеживать несколько процессов одновременно
- Не расходуется процессорное время
- Логически обоснованное применение потоков
Четвертый способ недостатки:
- Поток, таймер - это все объекты ядра, и как я говорил без особой надобности их использовать не рекомендуется (хотя тут потоки спят, но все же)
- Невозможность реализации на чистом VB (если с DLL, то само наличие библиотеки можно так же посчитать за минус, т.к. многие программеры не любят обилия библиотек в каталоге с прграммой)
- После вызова функции код продолжает выполняться
- Следовательно прийдется отдельно писать обработчик события, что в конечном счете усложняет код
И так, я высказал все что я думаю о всех этих способах. И я по прежнему приверженец того кода что отпостил сам. Но! все зависит от конкретной ситуации и требований.
Я полагаю что все решения данной проблеммы имеют право на жизнь, следовательно выносится вердикт: Ничья!
Мое мнение, разумеется, субъективно и вы можете его оспорить, я думаю Если так же выпишите все "за и против", как это сделал я.
А там посмотрим ...
sne, если я ошибаюсь в этих пунктах, по плиз, поправь меня:
После вызова функции код продолжает выполняться
То, что программа может <выполнять полезные действия> \ <не выполнять бесполезные> в процессе ожидания - это минус??? Честно сказать, это для меня открытие
Следовательно прийдется отдельно писать обработчик события
Обработчик придётся писать во всех четырёх вариантах, иначе программу писать вообще незачем, не так ли?
само наличие библиотеки можно так же посчитать за минус
Напомню, что Винда и есть набор dll-файлов (библиотек). И если программера пугает слово "dll" - то что это за программер такой?
Логически обоснованное применение потоков
и
без особой надобности их использовать не рекомендуется
Ты не противоречишь сам себе? Мне так показалось.
Я уважаю твою безмерную терпимость, но имхо, иногда стоит и ...
Я имел ввиду что идет выполнение кода, вызывается твоя функция, и она не ожидает завершения процесса а опосля исполняется код.
Запуск процесса с ожиданием его завершения, как это я понимаю, по сути похож на вызов модального окна или MsgBox'a, которые не отдают управления родителю до тех пор пока их не закроют!
Или я уже отстал от жизни и придумали к этой формулировке что-то новое !?
Обработчик придётся писать во всех четырёх вариантах, иначе программу писать вообще незачем, не так ли?
Не прийдется, в 1 и 3 случаях код начнет выполнение с того места где он остановился.
Или ты при вызове, скажем, MsgBox'a далее по его зыкрытию пишешь следующий за ним код в отдельной процедуре? Интересно
Напомню, что Винда и есть набор dll-файлов (библиотек). И если программера пугает слово "dll" - то что это за программер такой?
Ну это не меня пугает, а люд Ты посчитай-ка сколько тем про Fusion и ему подобных
Ты не противоречишь сам себе? Мне так показалось.
Я сказал логическое. Логическое, в моем понимании, это то что на листе бумаги без конкретной реализации.
Практическое, также imho, это то что на практике. На него навязываются всевозможные ограничения, глюки, и пр. ерунда. В данном случае тут уже сама OS наступает нам на пятки
Я уважаю твою безмерную терпимость, но имхо, иногда стоит и ...
Спасибо, конечно, но я не считаю что во-первых стоит отдать свое предпочтение какому-то из вариантов, во-вторых, я не намерен выбирать между людьми и называть кого-то ламером, а кого-то возносить до небес (ну не мое это), в-третьих все варианты работают, а значит имеют право на существование и использование
А то что вариант с таймером, кривоват, это я с тобой согласен, опять-же imho, кому что нравится
Когда допустим ждёшь в цикле, то сразу за телом цикла и следует твой обработчик, т.е. действия программы после закрытия calc.exe У меня, как ты заметил, эти действия вынесены в text_change(). Специально вызывать этот обработчик не надо, тебя позовут, когда будет необходимость. И я действительно, если надо, выношу обработку действий юзера по msgbox в отдельную процедуру. Если так например строк 30-40 кода, логичней выделить это в отдельную процедуру и дать ей осмысленное имя. И гораздо наглядней.
А модальных msgbox'ов не люблю, зачастую бывает, что msgbox оказывается снизу родителя, и никак его оттуда не достать, и родитель завис в ожидании реакции, в сторону не отодвинешь. Приходится убивать процесс. Это не есть гут.
А представь, что разработчики Windows испугались слова dll? Что бы мы имели?
И не призываю тебя возносить кого-либо куда-либо или же называть кого-то как-то. Не к этому я написал.
Да и вообще, я тоже сделал бы просто цикл, только Sleep 0, и всё. Я не говорю о том, что проще или легче сделать. Не в этом дело. Я предлагаю, как сделать правильней. Если предлагаешь какой-то вариант, то нехорошо плевать в сторону предложившего другое решение, а то неровен час, можешь и сам оказаться в таком же положении.
2Cresta: а ты уверен, что я не напишу такой библиотеки? ))) смешно...
Но я уже не хочу продолжать спор дальше. Я предложил 2 варианта: WaitForSingleObject и таймер, НО В ОТВЕТЕ №8 Я ПЕРВЫЙ ПОРЕКОМЕНДОВАЛ ЮЗАТЬ БИБЛИОТЕКУ, уж после меня и ты заговорил о ней, просто мне показалось нецелесообразным юзанье библиотеки для такой пустяковой задачи, но все же вариант я не отбрасывал. "Так что дети закройте свои ротики".
Своё мастерство нужно доказывать проектами а не постами...хи-хи...а по проектах чемпион у нас CyRax и sne, вот их действительно можно послушать...