powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
25 сообщений из 27, страница 1 из 2
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539203
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 сек - значит выбиваем -> ошибка, не получилось, но программа при этом жива и идем дальше.
(самой ф-цией естественно никаких таймаутов не предусмотрено).
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539229
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы сделал проще - зависающую функцию вынес бы в отдельное приложение и запускал через Process.Start
Соответственно, если после старта она за 10(20, 30, ...) секунд сама не завершилась, делать Process.Kill

Думаю, также можно через отдельный AppDomain осуществлять такую работу - грузить сборку в домен, запускать Task с CancellationToken и выгружать домен.
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539238
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79вынес бы в отдельное приложение и запускал через Process.Start
Или в отдельный поток?
Но там блин параметров до фига.
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539240
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Arm79вынес бы в отдельное приложение и запускал через Process.Start
Или в отдельный поток?
Но там блин параметров до фига.

Нет, не поток. Именно отдельное адресное пространоство
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539244
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гугли Task, Cancellation token, Timeout
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539301
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Arm79вынес бы в отдельное приложение и запускал через Process.Start
Или в отдельный поток?
Но там блин параметров до фига.
В отдельный поток нельзя, т.к. убивая поток ты не очистишь выделенную им память, т.е. будет утечка памяти.
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539316
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
Ставьте что вам проще - таймер, процесс, поток, три клавиши.
И тестируйте
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539420
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
как от себя отрываю:
CoRegisterMessageFilter
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539426
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

+1 поддерживаю решение с отдельным процессом
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539439
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AppDomain еще как вариант, но его можно и не выгрузить :)
А вообще используйте операции с timeout'ом и поддержкой CancellationToken'а и не будет таких проблем
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539443
Addx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неужели кому-то еще нужны факсы?
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539446
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesCancellationToken'а
Сам этот объект не прерывает. Он только сигналит bool флагом.
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539471
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

namespace TimoutProcess
{
    class Program
    {
        static async Task<int> ExecuteProcessAsync(string exeFile, string args, CancellationToken token)
        {
            var startInfo = new ProcessStartInfo
            {
                FileName = exeFile,
                Arguments = args,
                UseShellExecute = false,
                CreateNoWindow = true,
                WindowStyle = ProcessWindowStyle.Hidden
            };

            using (var process = new Process { StartInfo = startInfo })
            {
                process.Start();
                
                while (!process.HasExited)
                {
                    await Task.Delay(500).ConfigureAwait(false);
                    if (token.IsCancellationRequested)
                    {
                        process.Kill();
                        token.ThrowIfCancellationRequested();
                        break;
                    }
                    
                }
                return process.ExitCode;
            }
        }

        static void Main(string[] args)
        {
            MainAsync(args).GetAwaiter().GetResult();
        }

        static async Task MainAsync(string[] args)
        {
            var tokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(4));
            await ExecuteProcessAsync("cmd.exe", null, tokenSource.Token);
        }
    }
}
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539490
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДмитрий77пропущено...

Или в отдельный поток?
Но там блин параметров до фига.
В отдельный поток нельзя, т.к. убивая поток ты не очистишь выделенную им память, т.е. будет утечка памяти.
hVosttDima T,

+1 поддерживаю решение с отдельным процессом

Я вас услышал. Но там как бы наворочено всего.
Вызов такой
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
      AddMail2FaxLog("   Submitting fax job(s) to the fax server...")
      With MyFaxJob
        Dim err_text As String = "", JobID As Object = Nothing, ErrorBodyFile As Integer = -1, dwRes As Integer = 0
        If SendFaxComEx(err_text, JobID, dwRes, ErrorBodyFile, _
         g_objFaxServer, _
         .RecFaxNumber, .RecName, _
         .Bodies, .DocumentName, _
         .CoverPageType, .CoverPage, .Subject, .Note, _
         .ScheduleType, .ScheduleTime, _
         .Priority, .UseDefaultSender, _
         .SdrTsid, .SdrName, .SdrFaxNumber, .SdrEmail, _
         .SdrCompany, .SdrDepartment, .SdrTitle, .SdrOfficeLocation, _
         .SdrHomePhone, .SdrOfficePhone, .SdrAddress, .SdrBillingCode, .ForceEmailAddress) Then
          AddMail2FaxLog("   Submitting fax job(s)... OK.")
        Else



Функция (моя) такая:
Код: 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.
  Public Function SendFaxComEx(ByRef err_text As String, ByRef JobID As Object, _
   ByRef dwRes As Integer, ByRef ErrorBodyFile As Integer, _
   ByRef objFaxServer As FAXCOMEXLib.FaxServer, _
   ByVal RecFaxNumber As String(), _
   Optional ByVal RecName As String() = Nothing, _
   Optional ByVal Bodies As String() = Nothing, _
   Optional ByVal DocumentName As String = vbNullString, _
   Optional ByVal CoverPageType As FAXCOMEXLib.FAX_COVERPAGE_TYPE_ENUM = FAXCOMEXLib.FAX_COVERPAGE_TYPE_ENUM.fcptNONE, _
   Optional ByVal CoverPage As String = "generic", _
   Optional ByVal Subject As String = vbNullString, _
   Optional ByVal Note As String = vbNullString, _
   Optional ByVal ScheduleType As FAXCOMEXLib.FAX_SCHEDULE_TYPE_ENUM = FAXCOMEXLib.FAX_SCHEDULE_TYPE_ENUM.fstNOW, _
   Optional ByVal ScheduleTime As Date = Nothing, _
   Optional ByVal Priority As FAXCOMEXLib.FAX_PRIORITY_TYPE_ENUM = FAXCOMEXLib.FAX_PRIORITY_TYPE_ENUM.fptNORMAL, _
   Optional ByVal UseDefaultSender As Boolean = True, _
   Optional ByVal SdrTsid As String = vbNullString, _
   Optional ByVal SdrName As String = vbNullString, _
   Optional ByVal SdrFaxNumber As String = vbNullString, _
   Optional ByVal SdrEmail As String = vbNullString, _
   Optional ByVal SdrCompany As String = vbNullString, _
   Optional ByVal SdrDepartment As String = vbNullString, _
   Optional ByVal SdrTitle As String = vbNullString, _
   Optional ByVal SdrOfficeLocation As String = vbNullString, _
   Optional ByVal SdrHomePhone As String = vbNullString, _
   Optional ByVal SdrOfficePhone As String = vbNullString, _
   Optional ByVal SdrAddress As String = vbNullString, _
   Optional ByVal SdrBillingCode As String = vbNullString, _
   Optional ByVal ForceEmailAddress As Boolean = False
   ) As Boolean

    SendFaxComEx = True

    'Dim objFaxServer As New FAXCOMEXLib.FaxServer
    Dim objFaxDocument As New FAXCOMEXLib.FaxDocument

    Try
      ''Connect to the fax server
      'objFaxServer.Connect("")

      With objFaxDocument
        'Set the fax body
        If Not Bodies Is Nothing Then .Bodies = Bodies
        '.Body = FileName

        'Name the document
        .DocumentName = DocumentName

        'Add the recipient(s) with the fax number RecFaxNumber(j) and name RecName(j)
        If Not RecFaxNumber Is Nothing Then
          For i As Integer = 0 To UBound(RecFaxNumber)
            If IsNothing(RecName) OrElse (UBound(RecFaxNumber) < i) Then
              .Recipients.Add(RecFaxNumber(i))
            Else
              .Recipients.Add(RecFaxNumber(i), RecName(i))
            End If
          Next
        End If

        'Set the cover page type and the path to the cover page
        .CoverPageType = CoverPageType
        .CoverPage = CoverPage

        .Subject = Subject

        'Provide the cover page note
        .Note = Note

        'Specify that the fax is to be sent at a particular time
        .ScheduleType = ScheduleType
        .ScheduleTime = ScheduleTime

        'Set the fax priority
        objFaxDocument.Priority = Priority


        'Set the sender properties.
        With .Sender
          If UseDefaultSender Then
            .LoadDefaultSender()
          Else
            .TSID = SdrTsid
            .Name = SdrName
            .FaxNumber = SdrFaxNumber 'может быть более 20 символов, но только первые 20 передаются в TSID
            .Email = SdrEmail
            .Company = SdrCompany
            .Department = SdrDepartment
            .Title = SdrTitle
            .OfficeLocation = SdrOfficeLocation
            .HomePhone = SdrHomePhone
            .OfficePhone = SdrOfficePhone
            .StreetAddress = SdrAddress
            .BillingCode = SdrBillingCode
          End If
          If Strings.Len(.TSID) = 0 Then ' проблемы если он пустая строка
            If Strings.Len(.FaxNumber) > 0 Then
              .TSID = Strings.Left(.FaxNumber, 20) 'Факс-сервер итак это сделает, но не более 20 символов
            Else
              .TSID = " " 'workaround, иначе можно загнуть службу факсов
            End If
          End If
        End With

        If ForceEmailAddress Then 'вынуждены использовать .Sender.Email т.к. ReceiptAddress недоступно на XP, да и некорректно
          'Provide the e-mail address for the mail2fax notification
          .Sender.Email = SdrEmail
        End If

        If Not Bodies Is Nothing Then
          dwRes = .ConnectedSubmit2(objFaxServer, JobID, ErrorBodyFile)
          If (dwRes <> S_OK) Or (ErrorBodyFile <> -1) Then
            SendFaxComEx = False
            err_text = RaiseAPIErrorByNumber(dwRes)
            'If ErrorBodyFile <> -1 Then
            '  err_text = RaiseAPIErrorByNumber(dwRes) & ". Error Index File = " & CStr(ErrorBodyFile)
            'Else
            '  err_text = RaiseAPIErrorByNumber(dwRes)
            'End If
          End If
        Else 'нет смысла делать .ConnectedSubmit2, если нет Body(s) + более точное описание ошибки если Cover Page также отсутствует
          JobID = .ConnectedSubmit(objFaxServer)
        End If
      End With

    Catch
      SendFaxComEx = False
      err_text = Err.Number.ToString & " (" & Err.Description & ")"
    End Try

    'Try : objFaxServer.Disconnect() : Catch : End Try

  End Function



Собаку с висяком могут сделать .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")-но они увы не покрывают требуемый функционал.

Проблема как бы для меня не новая и давно известная.
Но иногда так подумаешь, а вдруг можно культурно пофиксить.
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539505
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,


Дмитрий77Но там как бы наворочено всего.

Общий функционал можно вынести в отдельную сборку и это решит проблему наворотов, даст возможность выносить отдельный функционал в отдельные приложения, запускать и грохать их, не переживая за утечки памяти.
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539530
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
Да. Но у него кода где вставить токен нету.
Код уходит в зависание, к примеру в пул принтера. И там висит.
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539536
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttОбщий функционал можно вынести в
+1
Счас есть сканеры и драйверы по http.
Есть серверы отчётов с заданием по урл строке.
Выделить в отдельный кусок чёрный ящик с входом и выходом.
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539547
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Roman Mejtes,
Да. Но у него кода где вставить токен нету.
Код уходит в зависание, к примеру в пул принтера. И там висит.угу, код уходит в ожидание ответа другого процесса в петлю обработки сообщений
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539585
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий771) допустим передам параметры через CMD, но (кроме того что их до фига и не все строки) с учетом того что RecFaxNumber As String(), RecName As String(), Bodies As String() это массивы-гимор уже обеспечен
А вы попробуйте сериализацию/десериализацию в/из XML/JSON
А параметры не отдельно, а формировать DTO

Тогда вообще не будет проблем.
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539596
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

где тут гемор? у вас есть четко определенные входные параметры, их можно грузить через ввод\вывод, через файло, да по сути любой IO. Довольно много программа так делают и это считается вполне нормальной практикой, совсем не обязательно всё в 1 кучу упихивать. Как раз, когда в 1 сборке все подряд, это плохая практика.
Тут есть еще 1 момент, если у вас очередь принтера используется, то прервав процесс, на очередь это не скажется и она будет продолжать висеть, если в ней завис таск на печать.
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539616
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

так ты Metro-приложение пишешь?

хитрый способ либо 20885148 , либо внешнее приложение и то с учётом метромодерна вопросы возникают нехилые
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539789
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
10.20.2017@22:07:24.613:      Submitting fax job(s) to the fax server...
10.20.2017@22:12:24.909:      Submitting fax job(s)... Failed. Error=-2147024638 (Время ожидания операции истекло). Error Index File = 1 (pdfprint.pdf) 


Т.е. эта хрень висела-висела и через ровно 5 минут сама заявила "Надоело мне висеть".
5 минут это конечно до фига, но это не вечность (и получается не совсем дебилы этот метод ваяли).
У юзера в конце концов есть лог и повод задуматься о дальнейшей настройке системы.

prinnto это по определению вещь мутная
не хочешь нарываться - можно тупо запретить все кроме TIFF (+ м.б. несколько понятных расширений, которые предварит. в TIFF конвертировать без "печати-автомата"),
но это значит сильно ограничить потенциальные возможности системы
что-то на эту тему хорошо сказано про "лучше стрелять в ногу", забыл как точно.

Надо поэкспериментировать еще с другими подлыми случаями,
и если этот 5 минут таймаут "на все случаи", то возможно правильно с этим согласиться
и не искать приключений типа "отдельных процессов".
Ну напишу я свое кривое вышибалово через 10 сек, сразу возражение - файл в 50 страниц (мало ли, в моей практике есть факс-любители такой многостраничности - через VoIP 50 страниц это кстати кронты в 90% случаев) за 10 сек может не успеть распечататься.
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539793
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче не совсем все плохо, внутреннее вышибалово всегда срабатывает ровно через 5 минут, причем с корректным возвратом ошибки:
Код: vbnet
1.
Error=-2147024638 (Время ожидания операции истекло). Error Index File =


Я бы конечно этот таймаут уменьшил хотя б до 1-2 минут, надо б доки почитать, вдруг есть что на эту тему.
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539811
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, ничего не нашел.
Видимо таймаут 5 минут зашит в метод.
Но уже хорошо что это таки есть.
Теоретически было бы правильно делегировать каждую такую процедуру отдельному процессу (потоку) - даже вообще не контролируя его - сделает свои дела выйдет, в крайнем случае через 5 минут все равно сдохнет - в любом случае отчитается.
Но пока так делать не буду, не хотелось бы нарушать последовательную логику приложения и разводить бардак.
...
Рейтинг: 0 / 0
А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
    #39539843
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Ещё один читерский вариант, RPC-проца в цикле ожидания отрабатывает WM_PAINT. Пользователь когда начинает нервничать начинает тыкать, что почти гарантировано вызовет прорисовку. Эксепшн в прорисовке вызовет выход из ожидающего метода.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А можно ли как-то поставить ловушку-вышибалку на ф-цию которая может мертво зависнуть?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]