|
Запуск внешней программы, контроль работает ли еще она через таймер. Не могу понять глюк.
|
|||
---|---|---|---|
#18+
Грубо: появился некий файл в формате A, надо проконвертировать его в формат Б и отобразить на форме. Конвертацию осуществляем внешней proga.exe. Алгоритм: 1) Запускаем proga.exe через Shell (завершения не ждем, т.к. конвертация требует чуть времени, неохота стопорить основной процесс) 2) Там же запускаем таймер. Код: vbnet 1. 2.
3) Таймер тупо проверяет запущена ли еще proga.exe и если НЕТ, то отображает файл, полученный как результат работы proga.exe Код: vbnet 1. 2. 3. 4. 5. 6.
Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
В таймере стоял Интервал=100. И все хорошо и давно это использую, но дернул меня нечистый испытать это на старом слабеньком P-III. И не сработало, т.е. картинка не отобразилась. Стал искать причины, вставлять всякие дебаги и т.п.. И кажется мне причина в следующем: Условие таймера If IsProgaRun("proga") = False похоже срабатывает до того как появился процесс с именем "proga". Т.е. таймер вышибает еще до того как появился процесс, завершение которого он должен контролировать. А не после того как он уже завершился . Может ли такое быть? И если ДА то как лечить? В-1)) не делать ничего. P-III это редкость, прога от этого не вылетает и в крайнем случае юзер может перещелкнуть записи в ListView и картинка в итоге отобразится. В-2)) Если поставить Интервал=200 вместо 100, то проблема на P-III решается, но не слишком ли это много, с учетом того что на быстрых компьютерах конвертер частенько работает быстрее со многими файлами (не уверен, но...) В-3)) Могу конечно сделать что-то типа Код: vbnet 1. 2. 3. 4. 5. 6.
Но это потенциальный глюк (гораздо больший), если вдруг proga.exe вообще не запустилась и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2012, 08:23 |
|
Запуск внешней программы, контроль работает ли еще она через таймер. Не могу понять глюк.
|
|||
---|---|---|---|
#18+
Дмитрий77В-3)) Могу конечно сделать что-то типа Код: vbnet 1. 2. 3. 4. 5. 6.
Но это потенциальный глюк (гораздо больший), если вдруг proga.exe вообще не запустилась и т.п. Бог с ним, поставил заглушку так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
И иди оно лесом. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2012, 09:08 |
|
Запуск внешней программы, контроль работает ли еще она через таймер. Не могу понять глюк.
|
|||
---|---|---|---|
#18+
> Автор: Дмитрий77 > Бог с ним, поставил заглушку так: У моих пользователей была проблема: в ексельных файлах были ссылки на другие файлы и в какой-то момент эти ссылки из-за чего-то изменились и перестали работать. Т.к. версия офиса уже была 2007-я то я сделал небольшой макрос, который указаный файл или файлы из указаной папки распаковывал во временную папку, находил XML в котором хранились пути внешних ссылок, исправлял там все как правильно и запаковывал обратно в файл ексела. Т.к. распаковка\запаковка выполняла сторонняя программа, то возникла необходимость ожидать окончание процесса. Что я и сделал. Макрос работал на терминальном сервере win2008 x64 и при одновременном использовании разными пользователями ошибок не было Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2012, 12:11 |
|
Запуск внешней программы, контроль работает ли еще она через таймер. Не могу понять глюк.
|
|||
---|---|---|---|
#18+
> Автор: Игорь Горбонос Забыл декларации :( Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2012, 12:14 |
|
Запуск внешней программы, контроль работает ли еще она через таймер. Не могу понять глюк.
|
|||
---|---|---|---|
#18+
Игорь Горбонос, Это все понятно. У меня для ожидания завершения процесса есть ф-ция Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Но она (как чувствую и в вашем случае) "берет всю прогу на себя", т.е. если время работы внешней проги ощутимо для зрения/слуха и т.п., то это будет "заметно". Поэтому я здесь это не использую а передаю "ждать" на таймер, что не грузит основную прогу. А "затычка" хотя и "грузит", но это 1/5сек для слабенького P-III (что незаметно), время то самой конвертации особенно для P-III поболе будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2012, 13:19 |
|
Запуск внешней программы, контроль работает ли еще она через таймер. Не могу понять глюк.
|
|||
---|---|---|---|
#18+
> Автор: Дмитрий77 > Но она (как чувствую и в вашем случае) "берет всю прогу на себя", Понял, а ты поставь в цикл вызов WaitForSingleObject, вместо вызова GetExitCodeProcess, но последний параметр укажи не INFINITE, а поставь конкреное значение милисекунд. Тогда это значение милисекунд будет висеть не загружая процессор, а потом DoEvents обработает скопившиеся оконные сообщения, и снова уснет на заданное значение милисекунд. У меня это был макрос в Екселе, поэтому мне не критично что интерфейс не откликается - пока не исправятся сслыки работать все равно нельзя Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2012, 15:22 |
|
Запуск внешней программы, контроль работает ли еще она через таймер. Не могу понять глюк.
|
|||
---|---|---|---|
#18+
Игорь Горбонос, спасибо. Много я мудрил со всем этим неоднократно. Можно сделать поиск по моим темам но неохота. И многое мне с этими синхронностями/асинхронностями не нравится. То все одно виснет, то какие-то часики (иконка мышки) вирусоподобные появляются - как раз помнится при тех словах что Вы употребляете. Таймер в данном случае думаю самое то. Просто не предполагал что первый тик таймера может случиться раньше чем Shell запустит proga.exe. Ну, короткий цикл для страховки перед запуском таймера. Ну, страховка страховки: Код: vbnet 1.
чтоб если глюк то вышла через секунду Ну пере-перестраховка Код: vbnet 1.
-это если жареный петух клюнет ровно в полночь. Смешно, но у меня в практике была ситуация, когда цикл (причем шаг был около 3-х минут) встал ровно в полночь из-за отсутствия этого условия. Короче заклеили скотчем и авось не прорвет. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2012, 16:33 |
|
|
start [/forum/topic.php?fid=60&msg=37884157&tid=2157581]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 139ms |
0 / 0 |