В многопотоке поставить задачу исключительно одному потоку

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Если ты правильно меня понял, то такая заготовка была бы тепло встречена на конкурсе. Многие бы хотели иметь возможность не терять данные из переменных при вынужденном прерывании шаблона. Такое вроде было в планах у самих разработчиков, вроде вызывать Bad_end при прерывании. Но я давно не отслеживал этот момент.
Вот именно. @RoyalBank не знаю почему ты скромничаешь, если ты действительно готов поделится в рамках конкурса и тебя останавливает только скромность, то это похвально конечно. Но хвала будет в разы больше если этим чудесным методом поделишься с сообществом))
 

tatarin

Client
Регистрация
28.10.2012
Сообщения
795
Благодарностей
131
Баллы
43
Нужно в зенку запилить функцию запуска шаблона, после выполнения какого-либо условия! Например, ставишь 100 выполнений, и добавляешь условие, что после того как выполниться, запустить шаблон(проект определенный)! Например, 3 запуска завершились с ошибкой, запускаем шаблон(проект определенный)! Например, выполнилось 10 успешный заданий, запускаем шаблон(проект определенный)! Я так вижу эту функцию, очень удобно! Прикольная функция кстати была бы! Хочешь например получить сообщение в телегу после того как выполнилось 100 успешных, пожалуйста!
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
Нужно в зенку запилить функцию запуска шаблона, после выполнения какого-либо условия! Например, ставишь 100 выполнений, и добавляешь условие, что после того как выполниться, запустить шаблон(проект определенный)! Например, 3 запуска завершились с ошибкой, запускаем шаблон(проект определенный)! Например, выполнилось 10 успешный заданий, запускаем шаблон(проект определенный)! Я так вижу эту функцию, очень удобно! Прикольная функция кстати была бы! Хочешь например получить сообщение в телегу после того как выполнилось 100 успешных, пожалуйста!
а что стоит вывести поток отдельный в шаблоне и пусть он в цикле вечно крутится и проверяет сколько успешных, а там уже делай действия какие надо
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113
Нужно в зенку запилить функцию запуска шаблона, после выполнения какого-либо условия! Например, ставишь 100 выполнений, и добавляешь условие, что после того как выполниться, запустить шаблон(проект определенный)! Например, 3 запуска завершились с ошибкой, запускаем шаблон(проект определенный)! Например, выполнилось 10 успешный заданий, запускаем шаблон(проект определенный)! Я так вижу эту функцию, очень удобно! Прикольная функция кстати была бы! Хочешь например получить сообщение в телегу после того как выполнилось 100 успешных, пожалуйста!
а кто будет определять что задание выполнилось успешно ? может оно не выполнило поставленную задачу и просто вышел шаблон.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113

Phoenix78

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

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
547
Баллы
93
не знаю почему ты скромничаешь, если ты действительно готов поделится
Я не скромничаю, мои познания в C# на уровне написания шаблонов в ZP. Что касается поделиться, то у меня нет готового решения. Но если я все правильно понял, то имхо, его можно сделать. Если сделаю, то выложу. Не вижу смысла ждать чего-то для этого, там простая обертка с проверкой, строк 20-30 от силы.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
Я не скромничаю, мои познания в C# на уровне написания шаблонов в ZP. Что касается поделиться, то у меня нет готового решения. Но если я все правильно понял, то имхо, его можно сделать. Если сделаю, то выложу. Не вижу смысла ждать чего-то для этого, там простая обертка с проверкой, строк 20-30 от силы.
тебе так кажется всё просто, один запросил одну проверку, например её сделали, это ведь ни 5 минут вставить в проект зенолаба для разработчиков как нам , тем более у всех разные хотения

P.S. напиши под себя просто либу или класс и все проблемы решены
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
547
Баллы
93
P.S. напиши под себя просто либу или класс и все проблемы решены
Ты меня неправильно понял, собственно, написать класс и была просьба выше (обертку для кода на скрине).

Что касается внедрений и плюшек, то я лично, отвечал в этой теме, чтобы попытаться закрыть потребность, чтобы её не пришлось реализовывать разрабам. Т.к. это все можно сделать в общем коде, нужно только объяснить, как это использовать.

В общем, логика, если просят что-то разрабов, то не потому что это критически важно, а потому что не знаю, как реализовать иначе. Если дать готовое решение, то отпадет потребность.
 
  • Спасибо
Реакции: Mikhail B.

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
547
Баллы
93
или ты смог прикрутить её вызов из любой точки шаба?
Если кто поможет допилить, буду признателен. Хотя не исключаю, что логика построенного конструкта вообще не годится для поставленной задачи... Собственно нужно правильно прописать остановку всего кода.

C#:
static TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
        
        public static async void Main(IZennoPosterProjectModel project) {
              await Task.Run(()=>St(project).Wait());
        }
        
        public static async Task St(IZennoPosterProjectModel project)
        {
            var task = stopTask(project);
            project.SendInfoToLog("Started");
            lock(SyncObject)
            {
                while (true) {
                    if (((ZennoLab.InterfacesLibrary.ProjectModel.Collections.IContextExt)project.Context).IsInterrupted) {
                        tcs.SetResult(true);
                        break;
                    } else if(Global.Variables.IsProjectMaker && !Global.Variables.IsDebugMode) {
                        tcs.SetResult(true);
                        break;
                    }
                }   
            }
            
            await task;
        }

        public static async Task stopTask (IZennoPosterProjectModel project) {
            await tcs.Task;
            project.SendInfoToLog("Stopped");
        }
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
Если кто поможет допилить, буду признателен. Хотя не исключаю, что логика построенного конструкта вообще не годится для поставленной задачи... Собственно нужно правильно прописать остановку всего кода.

C#:
static TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
       
        public static async void Main(IZennoPosterProjectModel project) {
              await Task.Run(()=>St(project).Wait());
        }
       
        public static async Task St(IZennoPosterProjectModel project)
        {
            var task = stopTask(project);
            project.SendInfoToLog("Started");
            lock(SyncObject)
            {
                while (true) {
                    if (((ZennoLab.InterfacesLibrary.ProjectModel.Collections.IContextExt)project.Context).IsInterrupted) {
                        tcs.SetResult(true);
                        break;
                    } else if(Global.Variables.IsProjectMaker && !Global.Variables.IsDebugMode) {
                        tcs.SetResult(true);
                        break;
                    }
                }  
            }
           
            await task;
        }

        public static async Task stopTask (IZennoPosterProjectModel project) {
            await tcs.Task;
            project.SendInfoToLog("Stopped");
        }
боюсь, я мало что знаю (ничего) о TaskCompletionSource. Единственное, бесконечный цикл настораживает. Без пауз он не будет выжирать проц?
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
а лок это чтобы другие потоки не зашли ?
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
547
Баллы
93
а лок это чтобы другие потоки не зашли ?
На третий/четвертый запуск цикла for 0 < 50 и нажатии кнопки стоп, у меня крашит PM, походу весь конструкт в топку. Возможно асинхр. остановка из любой точки не моё или не взлетает идея, которая была с запуском таска в async.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
На третий/четвертый запуск цикла for 0 < 50 и нажатии кнопки стоп, у меня крашит PM, походу весь конструкт в топку. Возможно асинхр. остановка из любой точки не моё или не взлетает идея, которая была с запуском таска в async.
этим ты мониторишь безбраузерный проект или браузерный ?
17 - я строка это что то новое или сам придумал или оно так сокращёно тоже работает, вот как я давно не посещал форум )))
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
и как понять на 3-й 4-й запуск,? типо включил один поток ждёшь а потом добавляешь потоки ?
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
547
Баллы
93
17 - я строка это что то новое или сам придумал или оно так сокращёно тоже работает, вот как я давно не посещал форум )))
Это проверка для PM, на нажатый "Stop", первая проверка для ZP.

В общем, запускаешь кубик C#, жмеш стоп, пока идет отчет. Он покажет в какой точке стопнули. Дальше если запустить кубик повторно и стоп, то у меня крашит. Подозреваю, что не закрыл таску в первой проходке. Как там приделать exception, чтобы он завершал код я х3, у меня на любом exception крашит. С таской и асинком идея скорее верная, но моя реализация походу кривая полностью.
 

Вложения

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 039
Баллы
113
Это проверка для PM, на нажатый "Stop", первая проверка для ZP.

В общем, запускаешь кубик C#, жмеш стоп, пока идет отчет. Он покажет в какой точке стопнули. Дальше если запустить кубик повторно и стоп, то у меня крашит. Подозреваю, что не закрыл таску в первой проходке. Как там приделать exception, чтобы он завершал код я х3, у меня на любом exception крашит. С таской и асинком идея скорее верная, но моя реализация походу кривая полностью.
да крашит, но я не расматривал что да как
 

Atlas

Client
Регистрация
16.02.2014
Сообщения
131
Благодарностей
7
Баллы
18
Не решили эту задачу?
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113

Atlas

Client
Регистрация
16.02.2014
Сообщения
131
Благодарностей
7
Баллы
18
Наверно и не стоит ждать решения. А собственными силами не удалось сделать? Опишите задачу, может подскажем чего.
Пока нет. "Куча костылей придумано, которые работают честно сказать так себе." - а можно пару ссылок? А то через поиск кроме этой темы почему-то не нашел ничего.
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Пока нет. "Куча костылей придумано, которые работают честно сказать так себе." - а можно пару ссылок? А то через поиск кроме этой темы почему-то не нашел ничего.
Есть снипет который считает глобалку. Если номер 0 то идет в одну сторону, если 1 и далее то в другую. Рабочий метод.

Проблема его в том, что эту самую глобалку надо обнулить в конце работы. Иначе след запуск будет с 51 условно, и все пойдет вправо. В целом эта проблема тоже решена в семерке, добавили галку выполнять BAD END при прерывании проекта.
Уже 3 года так работает парсер, в целом все нормально. Если следовать определенным инструкциям.
 
  • Спасибо
Реакции: Atlas

mogutov666

Client
Регистрация
29.09.2013
Сообщения
227
Благодарностей
25
Баллы
28
Есть снипет который считает глобалку. Если номер 0 то идет в одну сторону, если 1 и далее то в другую. Рабочий метод.

Проблема его в том, что эту самую глобалку надо обнулить в конце работы. Иначе след запуск будет с 51 условно, и все пойдет вправо. В целом эта проблема тоже решена в семерке, добавили галку выполнять BAD END при прерывании проекта.
Уже 3 года так работает парсер, в целом все нормально. Если следовать определенным инструкциям.
А есть пример снипета?
 

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