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

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 179
Благодарностей
816
Баллы
113
Как завершить выполнение программы из общего кода? Если выполняю throw new Exception() то project maker крашится
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113
раз страшиться, значит проблемы с зенкой. надо переустанавливать.
вообще return возвращает управление. но throw new Exception() тоже можно.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 606
Благодарностей
4 597
Баллы
113
Как завершить выполнение программы из общего кода? Если выполняю throw new Exception() то project maker крашится
всё зависит от того, где именно вызывается исключение. Если там создаётся отдельный поток и исключение в нём, то краш это нормальное поведение
 

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 179
Благодарностей
816
Баллы
113
У меня обработчик событий:
C#:
private void OnMessage(object sender, MessageEventArgs e)
        {
            if (condition1)
            {
                ...
            }
            
            if (condition2)
            {
                ...
                throw new Exception("Завершение работы");
            }
        }
по return выйти не получится, а по throw new Exception() крашится и ZP и PM
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 369
Благодарностей
3 293
Баллы
113

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 179
Благодарностей
816
Баллы
113
Где происходит вызов события? Нужно смотреть минимальный шаблон.
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("Завершение работы");
    }
}
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 606
Благодарностей
4 597
Баллы
113
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("Завершение работы");
    }
}
а где вызов инит?)
 

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 179
Благодарностей
816
Баллы
113
а где вызов инит?)
Из кубика C# вызов.
Я хочу перенести в зеннопостер мой код, написанный для консоли, и там выход сделан или через закрытие окна консоли или через ожидание нажатие любой клавиши в консоли.
C#:
public void Init()
{
    Client.OnMessage += OnMessage;
    ...
    Console.WriteLine("Press any key to exit");
    Console.ReadKey();
}
А в данном случае никак не придумаю как это правильно реализовать
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 369
Благодарностей
3 293
Баллы
113
там выход сделан или через закрытие окна консоли или через ожидание нажатие любой клавиши в консоли.
Самое простое - сделать ожидание закрытия Winform окна с кнопкой "Ок".

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

В обоих случаях, про кнопку "Стоп" придётся забыть. :(
 
Последнее редактирование:
  • Спасибо
Реакции: Zedx

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113
уверен на 70% что крашит не throw new Exception("Завершение работы"); а вот это Client.OnMessage += OnMessage;
так как зенка все таки не консоль и с формами надо немного по другому работать.
к тому же надо определиться форма должна быть модальной или работать параллельно потоку. отсюда и плясать.
 
  • Спасибо
Реакции: Zedx

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 369
Благодарностей
3 293
Баллы
113
уверен на 70% что крашит не throw new Exception("Завершение работы"); а вот это Client.OnMessage += OnMessage;
Нужно примерно такое (из примера для CodeCreator'а):
60067
только код в ExecuteCode должен располагаться в Init пользователя.

catch можно дописать для проверок на вылеты и добавить вывод в лог постера.
 
Последнее редактирование:

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
823
Баллы
93
Я хочу перенести в зеннопостер мой код, написанный для консоли, и там выход сделан или через закрытие окна консоли или через ожидание нажатие любой клавиши в консоли.
Первое что надо понять, это что зенка выполняет шаблон пошагово. Другими словами это большой метод, ну или типа процедурное программирование.
Если пытаться запихать в зенку код который работает с событиями то тут уже без костылей не обойтись.

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

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

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

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

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

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

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


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

Вложения

Dr.Pipetka

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

Moadip

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

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

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