|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Fax Service Extended COM Reference FaxDocument object IFaxDocument::Body property IFaxDocument2::Bodies property Вот эти два метода имеют потенциальную склонность к мертвому зависанию: FaxDocument.ConnectedSubmit method IFaxDocument2::ConnectedSubmit2 method Смысл в чем. Создаю объект FaxDocument Назначаю FaxDocument.Body ну либо FaxDocument.Bodies Body -это документ,файл- в общем случае может быть любой файл (т.е. с любым расширением) дальше вызываю FaxDocument.ConnectedSubmit либо FaxDocument.ConnectedSubmit2 (отправка документа на факс-сервер) Что оно делает. Смотрит на расширение .Body, ищет ассоциацию "printto" в системе для этого расширения, и выполняет печать в соответствии с найденной командой printto. (эдакая "вещь в себе") Здесь возможно 3 варианта: 1) printto найдено, документ распечатан, все OK 2) ф-ция возвращает ошибку (нет ассоциаций, для .ConnectedSubmit2 индекс плохого .Body) -это нормальный вариант 3) ф-ция просто тупо виснет (соответственно вместе со всем приложением) В общем случае отследить условия, предотвратить висяк (3) невозможно. Т.к. зависит от расширения, от ассоциаций файлов, от аккаунта под которым запустили. Т.е. есть вероятность возникновения ситуации (3) , полностью исключить невозможно. Есть ли какой-то хитрый общий способ "выбить" зависшую ф-цию? Висит напр. больше 10 сек - значит выбиваем -> ошибка, не получилось, но программа при этом жива и идем дальше. (самой ф-цией естественно никаких таймаутов не предусмотрено). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 21:29 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
я бы сделал проще - зависающую функцию вынес бы в отдельное приложение и запускал через Process.Start Соответственно, если после старта она за 10(20, 30, ...) секунд сама не завершилась, делать Process.Kill Думаю, также можно через отдельный AppDomain осуществлять такую работу - грузить сборку в домен, запускать Task с CancellationToken и выгружать домен. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 23:00 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Arm79вынес бы в отдельное приложение и запускал через Process.Start Или в отдельный поток? Но там блин параметров до фига. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 23:12 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Дмитрий77Arm79вынес бы в отдельное приложение и запускал через Process.Start Или в отдельный поток? Но там блин параметров до фига. Нет, не поток. Именно отдельное адресное пространоство ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 23:13 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
гугли Task, Cancellation token, Timeout ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2017, 23:22 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Дмитрий77Arm79вынес бы в отдельное приложение и запускал через Process.Start Или в отдельный поток? Но там блин параметров до фига. В отдельный поток нельзя, т.к. убивая поток ты не очистишь выделенную им память, т.е. будет утечка памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2017, 07:21 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Дмитрий77, Ставьте что вам проще - таймер, процесс, поток, три клавиши. И тестируйте ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2017, 08:28 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2017, 11:22 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Dima T, +1 поддерживаю решение с отдельным процессом ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2017, 11:34 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
AppDomain еще как вариант, но его можно и не выгрузить :) А вообще используйте операции с timeout'ом и поддержкой CancellationToken'а и не будет таких проблем ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2017, 11:49 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Неужели кому-то еще нужны факсы? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2017, 11:53 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Roman MejtesCancellationToken'а Сам этот объект не прерывает. Он только сигналит bool флагом. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2017, 11:57 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Petro123, через CancellationToken нужно ручками делать отмену конечно, не кто про халяву не говорит, просто нужно использовать для реализации как то так, но это пример на коленке Код: c# 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. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2017, 12:34 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Dima TДмитрий77пропущено... Или в отдельный поток? Но там блин параметров до фига. В отдельный поток нельзя, т.к. убивая поток ты не очистишь выделенную им память, т.е. будет утечка памяти. hVosttDima T, +1 поддерживаю решение с отдельным процессом Я вас услышал. Но там как бы наворочено всего. Вызов такой Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Функция (моя) такая: Код: 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. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131.
Собаку с висяком могут сделать .ConnectedSubmit2/.ConnectedSubmit - по причине плохого .Body(.Bodies) - причем понятие "плохое Body" сформулировать в общем случае невозможно, например метро-приложение ассоциированное с Body может на раз сделать его "плохим", а выберешь открывать по умолчанию "классическим" - сразу станет "хорошим". Лог я ес-но пишу, но в гадском случае он заканчивается строчкой (" Submitting fax job(s) to the fax server...") Вынести это в отдельное приложение - легко сказать. 1) допустим передам параметры через CMD, но (кроме того что их до фига и не все строки) с учетом того что RecFaxNumber As String(), RecName As String(), Bodies As String() это массивы-гимор уже обеспечен 2) ByRef objFaxServer As FAXCOMEXLib.FaxServer - объект факс-сервер надо поднимать отдельно каждый раз в этом "отдельном приложении" - а этот коннект как бы не пара миллисекунд (его разумно поднимать один раз при старте и контролировать что не отсоединился). 3) оно как бы возвращает не integer (ErrorLevel, ExitCode), а а) err_text (String) -описание ошибки б) ErrorBodyFile As Integer -номер "плохого" файла в) dwRes As Integer -номер ошибки г) JobID As Object - массив ID заданий Вывод консольного приложения через пайпы отлавливать? Врагу не пожелаю этим заниматься. .ConnectedSubmit2/.ConnectedSubmit (методы COM)- отдельно же в outside не вынесешь. MS конечно намудрил с этим COM, есть нормальные классич. API ("для win2000")-но они увы не покрывают требуемый функционал. Проблема как бы для меня не новая и давно известная. Но иногда так подумаешь, а вдруг можно культурно пофиксить. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2017, 12:50 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Дмитрий77, Дмитрий77Но там как бы наворочено всего. Общий функционал можно вынести в отдельную сборку и это решит проблему наворотов, даст возможность выносить отдельный функционал в отдельные приложения, запускать и грохать их, не переживая за утечки памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2017, 13:12 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Roman Mejtes, Да. Но у него кода где вставить токен нету. Код уходит в зависание, к примеру в пул принтера. И там висит. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2017, 13:45 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
hVosttОбщий функционал можно вынести в +1 Счас есть сканеры и драйверы по http. Есть серверы отчётов с заданием по урл строке. Выделить в отдельный кусок чёрный ящик с входом и выходом. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2017, 13:52 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Petro123Roman Mejtes, Да. Но у него кода где вставить токен нету. Код уходит в зависание, к примеру в пул принтера. И там висит.угу, код уходит в ожидание ответа другого процесса в петлю обработки сообщений ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2017, 14:06 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Дмитрий771) допустим передам параметры через CMD, но (кроме того что их до фига и не все строки) с учетом того что RecFaxNumber As String(), RecName As String(), Bodies As String() это массивы-гимор уже обеспечен А вы попробуйте сериализацию/десериализацию в/из XML/JSON А параметры не отдельно, а формировать DTO Тогда вообще не будет проблем. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2017, 14:51 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Дмитрий77, где тут гемор? у вас есть четко определенные входные параметры, их можно грузить через ввод\вывод, через файло, да по сути любой IO. Довольно много программа так делают и это считается вполне нормальной практикой, совсем не обязательно всё в 1 кучу упихивать. Как раз, когда в 1 сборке все подряд, это плохая практика. Тут есть еще 1 момент, если у вас очередь принтера используется, то прервав процесс, на очередь это не скажется и она будет продолжать висеть, если в ней завис таск на печать. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2017, 15:05 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Дмитрий77, так ты Metro-приложение пишешь? хитрый способ либо 20885148 , либо внешнее приложение и то с учётом метромодерна вопросы возникают нехилые ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2017, 15:37 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
kealon(Ruslan)так ты Metro-приложение пишешь? Нет конечно. Но если например я передаю в ф-цию какой-нибудь .jpg а в системе в ассоциациях прописано открывать его приложением "Фотографии" (а не классическим "rundll32 shimgvw.dll,ImageView_Fullscreen"), или например про .pdf сказано открывать его приложением Edge, то вероятность висяка велика, т.е. к примеру это "метро" может тупо открыть мой pdf/jpg (вообще без намеков на печать) и подвиснуть. А может просто подвиснуть ничего не выводя и не показывая. hVosttДмитрий77, Дмитрий77Но там как бы наворочено всего.Общий функционал можно вынести в отдельную сборку и это решит проблему наворотов, даст возможность выносить отдельный функционал в отдельные приложения, запускать и грохать их, не переживая за утечки памяти. Ну, в принципе, я глянул на код и если очень стараться, то я могу вынести не ф-цию, а гораздо больший кусок, но тогда уже этому "отдельному процессу" надо передавать гораздо больше интеллектуального функционала. Алгоритм. принимаем мыло раз напр. в 20сек сохраняем мыло в папке (msg1.eml, msg2.eml) Циклически работаем с каждым .eml (выжимаем из него и из настроек программы файлы-документ(ы), номер факса, данные для cover page и т.п.) Ну и если запихнуть всю работу с конкретным eml в этот "отдельный процесс", то параметр вообще один (файл .eml). Запускаем этот "отдельный процесс" и он тупо делает работу (парсит e-mail, создает задание факса, отправляет сам по мылу уведомления об ошибках). А основной процесс просто тупо ждет и реагирует лишь на "превышение таймаута", если превышен, то грохает "отдельный процесс" и только в этом случае что-то делает (запись в лог, уведомление по мылу об ошибке). Если так, то пожалуй можно. Но все одно гимор из-за этого проект делить лопатить. Roman MejtesТут есть еще 1 момент, если у вас очередь принтера используется, то прервав процесс, на очередь это не скажется и она будет продолжать висеть, если в ней завис таск на печать. Думал об этом, делал всякие тесты. Там плохие ситуации разные могут быть. Но уверенно могу сказать 2 вещи. 1) Подвисание ф-ции еще не обязательно означает подвисание очереди принтера. Т.е. ф-ция висит, а из другого экземпляра я могу благополучно распечатать другой "хороший файл", и подвисшее приложение никак не стопорит этот функционал. 2) Даже если подвисание, мешающее распечатке следующего и произошло (напр. файл .html - он зараза выводит "окно печати" через IE вместо "автомата"), то убийство подвисшего процесса (даже без этого окна) мгновенно разблокирует функционал. Ну и наконец, я уже задумался на тему что вообще что-то надо делать. Отвлекся, и нашел в своем логе вот такое: Код: vbnet 1. 2.
Т.е. эта хрень висела-висела и через ровно 5 минут сама заявила "Надоело мне висеть". 5 минут это конечно до фига, но это не вечность (и получается не совсем дебилы этот метод ваяли). У юзера в конце концов есть лог и повод задуматься о дальнейшей настройке системы. prinnto это по определению вещь мутная не хочешь нарываться - можно тупо запретить все кроме TIFF (+ м.б. несколько понятных расширений, которые предварит. в TIFF конвертировать без "печати-автомата"), но это значит сильно ограничить потенциальные возможности системы что-то на эту тему хорошо сказано про "лучше стрелять в ногу", забыл как точно. Надо поэкспериментировать еще с другими подлыми случаями, и если этот 5 минут таймаут "на все случаи", то возможно правильно с этим согласиться и не искать приключений типа "отдельных процессов". Ну напишу я свое кривое вышибалово через 10 сек, сразу возражение - файл в 50 страниц (мало ли, в моей практике есть факс-любители такой многостраничности - через VoIP 50 страниц это кстати кронты в 90% случаев) за 10 сек может не успеть распечататься. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2017, 23:10 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Короче не совсем все плохо, внутреннее вышибалово всегда срабатывает ровно через 5 минут, причем с корректным возвратом ошибки: Код: vbnet 1.
Я бы конечно этот таймаут уменьшил хотя б до 1-2 минут, надо б доки почитать, вдруг есть что на эту тему. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2017, 23:38 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Не, ничего не нашел. Видимо таймаут 5 минут зашит в метод. Но уже хорошо что это таки есть. Теоретически было бы правильно делегировать каждую такую процедуру отдельному процессу (потоку) - даже вообще не контролируя его - сделает свои дела выйдет, в крайнем случае через 5 минут все равно сдохнет - в любом случае отчитается. Но пока так делать не буду, не хотелось бы нарушать последовательную логику приложения и разводить бардак. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2017, 01:23 |
|
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
|
|||
---|---|---|---|
#18+
Дмитрий77, Ещё один читерский вариант, RPC-проца в цикле ожидания отрабатывает WM_PAINT. Пользователь когда начинает нервничать начинает тыкать, что почти гарантировано вызовет прорисовку. Эксепшн в прорисовке вызовет выход из ожидающего метода. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2017, 10:32 |
|
|
start [/forum/topic.php?fid=20&msg=39539443&tid=1399653]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
64ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 185ms |
0 / 0 |