Выход из программы в общем коде

  • Автор темы Автор темы Jufel
  • Дата начала Дата начала

Jufel

Client
Регистрация
12.06.2018
Сообщения
1 612
Реакции
1 124
Баллы
113
Как завершить выполнение программы из общего кода? Если выполняю throw new Exception() то project maker крашится
 
раз страшиться, значит проблемы с зенкой. надо переустанавливать.
вообще return возвращает управление. но throw new Exception() тоже можно.
 
Как завершить выполнение программы из общего кода? Если выполняю throw new Exception() то project maker крашится
всё зависит от того, где именно вызывается исключение. Если там создаётся отдельный поток и исключение в нём, то краш это нормальное поведение
 
У меня обработчик событий:
C#:
Развернуть Свернуть Копировать
private void OnMessage(object sender, MessageEventArgs e)
        {
            if (condition1)
            {
                ...
            }
            
            if (condition2)
            {
                ...
                throw new Exception("Завершение работы");
            }
        }
по return выйти не получится, а по throw new Exception() крашится и ZP и PM
 
Где происходит вызов события? Нужно смотреть минимальный шаблон.

C#:
Развернуть Свернуть Копировать
public void Init()
{
    Client.OnMessage += OnMessage;
    ...
    Thread.Sleep(int.MaxValue);
}

private void OnMessage(object sender, MessageEventArgs e)
{
    if (condition1)
    {
        ...
    }

    if (condition2)
    {
        ...
        throw new Exception("Завершение работы");
    }
}
 
C#:
Развернуть Свернуть Копировать
public void Init()
{
    Client.OnMessage += OnMessage;
    ...
    Thread.Sleep(int.MaxValue);
}

private void OnMessage(object sender, MessageEventArgs e)
{
    if (condition1)
    {
        ...
    }

    if (condition2)
    {
        ...
        throw new Exception("Завершение работы");
    }
}
а где вызов инит?)
 
а где вызов инит?)
Из кубика C# вызов.
Я хочу перенести в зеннопостер мой код, написанный для консоли, и там выход сделан или через закрытие окна консоли или через ожидание нажатие любой клавиши в консоли.
C#:
Развернуть Свернуть Копировать
public void Init()
{
    Client.OnMessage += OnMessage;
    ...
    Console.WriteLine("Press any key to exit");
    Console.ReadKey();
}
А в данном случае никак не придумаю как это правильно реализовать
 
там выход сделан или через закрытие окна консоли или через ожидание нажатие любой клавиши в консоли.
Самое простое - сделать ожидание закрытия Winform окна с кнопкой "Ок".

Ещё вариант, в цикле (с ожиданием!) чекать "Прерывание":
((ZennoLab.InterfacesLibrary.ProjectModel.Collections.IContextExt)project.Context).IsInterrupted

В обоих случаях, про кнопку "Стоп" придётся забыть. :(
 
Последнее редактирование:
  • Оценить
Реакции: Jufel
уверен на 70% что крашит не throw new Exception("Завершение работы"); а вот это Client.OnMessage += OnMessage;
так как зенка все таки не консоль и с формами надо немного по другому работать.
к тому же надо определиться форма должна быть модальной или работать параллельно потоку. отсюда и плясать.
 
  • Оценить
Реакции: Jufel
уверен на 70% что крашит не throw new Exception("Завершение работы"); а вот это Client.OnMessage += OnMessage;
Нужно примерно такое (из примера для CodeCreator'а):
60067
только код в ExecuteCode должен располагаться в Init пользователя.

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

Первое что надо понять, это что зенка выполняет шаблон пошагово. Другими словами это большой метод, ну или типа процедурное программирование.
Если пытаться запихать в зенку код который работает с событиями то тут уже без костылей не обойтись.

Если запустить что то из кубика зенки, которое будет генерить событие, то зенка не будет ждать, шаблон просто тупо завершит работу после того как будет выполнен кубик с кодом.
Поэтому, надо делать типа "обертку" поверх событийного кода, вариантов можно придумать много, но самый простой, это добавить в свой класс флаг - работаем/не работаем.
И в самом шабе сделать цикл, который будет этот флаг чекать, с определенным интервалом, соответственно шаб будет или продолжать работать, или остановится.

В своем же классе, надо этот флаг устанавливать в начале в true, что работаем, а при выполнении каких то условий false. Что и будет сигналом для завершения работы шаблона.
Данные из обработчика события пихаем в переменную/свойство, которое будет дергаться из шаба и что то делать с ним. Можно сделать сколько надо.
Примерно так.
60076

Накидал псевдо класс Client, который генерит событие раз в 1 сек.
И основной класс Test, через который и будет идти работа с основным классом.

Ну и собственно сам шаб.
Создаем объект, вызываем метод Init(), который и запустит всю работу.
Объект пихаем в project.Context, для дальнейшей работы.
60077

Тут собственно сама проверка, работаем дальше или нет.
60078

А тут интервал, через который проверяем флаг.
60079

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


Постарался объяснить максимально просто, насколько это возможно.:D
Ну и на последок, пихать в зенку событийный код, это то еще извращение.
 

Вложения

Ну сейчас в новых версиях сделали принудительное прерывание выполнение кода
В старых версиях можно юазать:
C#:
Развернуть Свернуть Копировать
if(((ZennoLab.InterfacesLibrary.ProjectModel.Collections.IContextExt)project.Context).IsInterrupted) return null; // Прерывание в ZP
if(Global.Variables.IsProjectMaker && !Global.Variables.IsDebugMode) return null; // Прерывание в PM
 
В старых версиях можно юазать:
C#:
Развернуть Свернуть Копировать
if(((ZennoLab.InterfacesLibrary.ProjectModel.Collections.IContextExt)project.Context).IsInterrupted) return null; // Прерывание в ZP
if(Global.Variables.IsProjectMaker && !Global.Variables.IsDebugMode) return null; // Прерывание в PM
Я знаю об этом способе, если ты внимательно читал сообщения выше, то о таком прерывании писал @Zymlex.
Суть в том, что если ты написал код и он "случайно" зациклился внутри одного экшена, то твой шаб виснет. Раньше помогал только ребут постера/мейкера, сейчас можно так остановить.
Не думаю что ты эти две строчки добавляешь в каждый цикл.))

Плюс дебажить шаб проще именно в пошаговом режиме, когда идет выход из экшена, и потом обратно, те цикл идет через внешний счетчик/условие, типа как если на кубиках сделан.
Поэтому тут все зависит от контекста. Где то лучше подойдет цикл внутри одного экшена, с кодом прерывания, а где то через внешний счетчик/условие.
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)