Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 | 4 |

 

  Вопрос: Shell - дождаться конца Добавлено: 30.10.04 07:29  

Автор вопроса:  magish

Ответить

  Ответы Всего ответов: 50  

Номер ответа: 31
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #31
Добавлено: 31.10.04 23:05
> Если память не изменяет, то это ты писал всякие там контролы типа Тяга
Тяга - open source, User control , и с активиксами там ничего общего.И написан он с нуля, избавлен от всех винсоковских багов и бесплатно роздан

Ответить

Номер ответа: 32
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #32
Добавлено: 31.10.04 23:55
да тут он я, давайте рассужу, проблемм в этом нет, у каждого способа имеются как свои плюсы так и минусы...

ЗЫ
Могу отследить закрытие любого кол-ва процессов, в одном потоке ;)

Ответить

Номер ответа: 33
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #33 Добавлено: 31.10.04 23:59
Если тебя так напугало содержимое dll, что она не open source, то пожалуйста: никому не возбраняется использовать:

;==========================================================================
CreateProc proc lParam:DWORD
LOCAL StartInfo :STARTUPINFO
LOCAL ProcInfo :PROCESS_INFORMATION
LOCAL Buff[10] :BYTE

invoke RtlZeroMemory,ADDR StartInfo, sizeof STARTUPINFO
mov StartInfo.cb, sizeof  STARTUPINFO
invoke RtlZeroMemory,ADDR ProcInfo, sizeof PROCESS_INFORMATION
xor edx,edx
invoke CreateProcess,ADDR ExeName,edx,edx,edx,edx,edx,edx,edx,ADDR StartInfo, ADDR ProcInfo
invoke WaitForSingleObject,ProcInfo.hProcess,0FFFFFFFFh
invoke CloseHandle,ProcInfo.hProcess
invoke CloseHandle,ProcInfo.hThread
invoke wsprintf,ADDR Buff,ADDR Formatter,ProcInfo.hProcess
invoke SetWindowText,lParam, ADDR Buff
ret

CreateProc endp

;================ For Export   ===========================================
CreateThr Proc ProgName:DWORD, BoxWnd:DWORD

invoke lstrcpy,ADDR ExeName,ProgName
m2m EventBox, BoxWnd
mov ecx,offset CreateProc
invoke CreateThread,NULL,NULL,ecx,BoxWnd,NULL,ADDR hThread
mov eax,hThread
ret

CreateThr endp


Это ещё меньше похоже на activex :))). Это не msvbvm60, которая даже поток создать не может, не завалившись :(

Ответить

Номер ответа: 34
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #34 Добавлено: 01.11.04 00:23
sne

Да вот и собственно весь код (ещё раз)

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 (может захочешь сам откомпилировать)

Ответить

Номер ответа: 35
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #35
Добавлено: 01.11.04 11:55
Блин, да я сам такую библиотеку за 5 мин. напишу. Для чего мне оно?Я говорю о практичности. Использовать отдельную библиотеку для такого - нет смысла. Есть смысл тогда, когда приложение должно серьезно работать в этой области, но когда все сводиться к банальному запуску одного процесса и ожидания его завершения...

Ответить

Номер ответа: 36
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #36 Добавлено: 01.11.04 15:49
"Да я, да я" - стучал тут себя в грудь некто Artyom, а как дошло до дела - так в кусты. История повторяется :) Кишка тонка, видимо.
Так что, прежде чем вешать на людей ярлыки типа "сделал по-ламерски", подумай хорошенько, может оказаться так, что твоё решение будет ещё более ламерским. Негоже кидаться такими выражениями. Потому и сидел в этой теме, чтобы дошло это до тебя.
Во всяком случае, в моих глазах ты точно заслужил, как выразился некто (не помнишь кто?)"премию ламерсок". За сим откланяюсь.

P.S.
magish, если интересно, пиши на мыло, объясню что и как делается. По-взрослому, не по-ламерски.

Ответить

Номер ответа: 37
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #37 Добавлено: 01.11.04 16:28
Эй, народ, ну хорош меня поминать всуе...

Ответить

Номер ответа: 38
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #38 Добавлено: 01.11.04 17:08
Кстати, а никто не исследовал возможности со SleepEx ?

Ответить

Номер ответа: 39
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #39 Добавлено: 01.11.04 20:43
2 cresta
Плз, еще раз перечитать, чем закончилась дискусия.

Если по теме сказать больше нечего было, то не надо обзывать опонентов ламерами.

Если тебя вопрос быстродействия алгоритма сортировки на VB .NET и асемблере интересует, то плз, ответить в топике .NET vs Basic 6, тк на этот форум я не подписан.

Ответить

Номер ответа: 40
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #40
Добавлено: 01.11.04 21:34
Дабы и спор закончить и поставить точку в вопросе о запуске с ожиданием завершения скажу свое слов (раз уж тут я в качестве арбитра выдвинулся работать)

Было предложено 4 идеи:
 1. Бесконечный цикл (мое)
 2. Использование таймера
 3. Ожидание с пом. WhaitForSingleObject
 4. Ожидание в потоке с пом. вышеупомянутой функции

Вот что я об этом думаю:
 Первый способ достоинства:
    - Минимум кода
    - Отсутствие подвисания (почти)
    - Не использует ресурсов системы (я про объекты ядра, см. далее)
    - Простота как в плане понимания так и написания ;)
    - Это действительно запуск с ожиданием завершения, т.е. по завершении процесса код выполняется с того места где был вызов функции

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

 Второй способ достоинства:
    - Простота понимания
    - Полное отсутствие подвисания программы
    - Гибкость, т.е. во время ожидания можно выполнять в таймере какой-то свой код...

 Второй способ недостатки:
    - Таймер есть объект ядра, создание которых не рекомендуется без веских на то оснований
    - Несколько грамозкое решение на несколько процедур
    - После вызова функции код продолжает исполняться далее, при этом приходиться создавать еще одну процедуру для обработки события, отсюда получается некоторая запутанность способа... Наглядным у меня рука не поднимается его назвать
    - Ограничение на использование, т.е. возможно использовние только на форме или в модуле (API)

Третий способ достоинства:
    - Вовсе не расходует процессорное время в режиме ожидания
    - Простота реализации
    - Выполнение кода начинается с места вызова функции

Третий способ недостатки:
    - Вызывает подвисание, т.к. все кванты выделенные нашему потоку успешно проходят мимо ;)

Четвертый способ достоинства:
    - Возможность отслеживать несколько процессов одновременно
    - Не расходуется процессорное время
    - Логически обоснованное применение потоков

Четвертый способ недостатки:
    - Поток, таймер - это все объекты ядра, и как я говорил без особой надобности их использовать не рекомендуется (хотя тут потоки спят, но все же)
    - Невозможность реализации на чистом VB (если с DLL, то само наличие библиотеки можно так же посчитать за минус, т.к. многие программеры не любят обилия библиотек в каталоге с прграммой)
    - После вызова функции код продолжает выполняться
    - Следовательно прийдется отдельно писать обработчик события, что в конечном счете усложняет код


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

Я полагаю что все решения данной проблеммы имеют право на жизнь, следовательно выносится вердикт: Ничья!

Мое мнение, разумеется, субъективно и вы можете его оспорить, я думаю ;) Если так же выпишите все "за и против", как это сделал я.
А там посмотрим :) ...

Ответить

Номер ответа: 41
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #41 Добавлено: 01.11.04 22:44
sne, если я ошибаюсь в этих пунктах, по плиз, поправь меня:

После вызова функции код продолжает выполняться

То, что программа может <выполнять полезные действия> \ <не выполнять бесполезные> в процессе ожидания - это минус??? Честно сказать, это для меня открытие :)

Следовательно прийдется отдельно писать обработчик события

Обработчик придётся писать во всех четырёх вариантах, иначе программу писать вообще незачем, не так ли?

само наличие библиотеки можно так же посчитать за минус

Напомню, что Винда и есть набор dll-файлов (библиотек). И если программера пугает слово "dll" - то что это за программер такой? :)

Логически обоснованное применение потоков
и
без особой надобности их использовать не рекомендуется

Ты не противоречишь сам себе? Мне так показалось.

Я уважаю твою безмерную терпимость, но имхо, иногда стоит и ...

Ответить

Номер ответа: 42
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #42
Добавлено: 02.11.04 09:02
поправляю :) (как это понимаю я)

После вызова функции код продолжает выполняться

Я имел ввиду что идет выполнение кода, вызывается твоя функция, и она не ожидает завершения процесса а опосля исполняется код.

Запуск процесса с ожиданием его завершения, как это я понимаю, по сути похож на вызов модального окна или MsgBox'a, которые не отдают управления родителю до тех пор пока их не закроют!
Или я уже отстал от жизни и придумали к этой формулировке что-то новое !?

Обработчик придётся писать во всех четырёх вариантах, иначе программу писать вообще незачем, не так ли?
Не прийдется, в 1 и 3 случаях код начнет выполнение с того места где он остановился.
Или ты при вызове, скажем, MsgBox'a далее по его зыкрытию пишешь следующий за ним код в отдельной процедуре? Интересно :)

Напомню, что Винда и есть набор dll-файлов (библиотек). И если программера пугает слово "dll" - то что это за программер такой? :)
:) Ну это не меня пугает, а люд :) Ты посчитай-ка сколько тем про Fusion и ему подобных ;)

Ты не противоречишь сам себе? Мне так показалось.
Я сказал логическое. Логическое, в моем понимании, это то что на листе бумаги без конкретной реализации.
Практическое, также imho, это то что на практике. На него навязываются всевозможные ограничения, глюки, и пр. ерунда. В данном случае тут уже сама OS наступает нам на пятки ;)

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

А то что вариант с таймером, кривоват, это я с тобой согласен, опять-же imho, кому что нравится ;)

Ответить

Номер ответа: 43
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #43 Добавлено: 02.11.04 13:46
Когда допустим ждёшь в цикле, то сразу за телом цикла и следует твой обработчик, т.е. действия программы после закрытия calc.exe У меня, как ты заметил, эти действия вынесены в text_change(). Специально вызывать этот обработчик не надо, тебя позовут, когда будет необходимость. И я действительно, если надо, выношу обработку действий юзера по msgbox в отдельную процедуру. Если так например строк 30-40 кода, логичней выделить это в отдельную процедуру и дать ей осмысленное имя. И гораздо наглядней.
А модальных msgbox'ов не люблю, зачастую бывает, что msgbox оказывается снизу родителя, и никак его оттуда не достать, и родитель завис в ожидании реакции, в сторону не отодвинешь. Приходится убивать процесс. Это не есть гут.

А представь, что разработчики Windows испугались слова dll? Что бы мы имели?
И не призываю тебя возносить кого-либо куда-либо или же называть кого-то как-то. Не к этому я написал.

Да и вообще, я тоже сделал бы просто цикл, только Sleep 0, и всё. Я не говорю о том, что проще или легче сделать. Не в этом дело. Я предлагаю, как сделать правильней. Если предлагаешь какой-то вариант, то нехорошо плевать в сторону предложившего другое решение, а то неровен час, можешь и сам оказаться в таком же положении.

Ответить

Номер ответа: 44
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #44
Добавлено: 02.11.04 15:16
2Cresta: а ты уверен, что я не напишу такой библиотеки? :)))) смешно...
Но я уже не хочу продолжать спор дальше. Я предложил 2 варианта: WaitForSingleObject и таймер, НО В ОТВЕТЕ №8 Я ПЕРВЫЙ ПОРЕКОМЕНДОВАЛ ЮЗАТЬ БИБЛИОТЕКУ, уж после меня и ты заговорил о ней, просто мне показалось нецелесообразным юзанье библиотеки для такой пустяковой задачи, но все же вариант я не отбрасывал. "Так что дети закройте свои ротики".
Своё мастерство нужно доказывать проектами а не постами...хи-хи...а по проектах чемпион у нас CyRax и sne, вот их действительно можно послушать...

Ответить

Номер ответа: 45
Автор ответа:
 Mihalыch



ICQ: 373-509-101 

Вопросов: 56
Ответов: 330
 Профиль | | #45 Добавлено: 02.11.04 15:32
Простите, сбился, пока за пивом бегал. А счет та какой, кто ведет?

Ответить

Страница: 1 | 2 | 3 | 4 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам