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

  • Автор темы Автор темы Mikhail B.
  • Дата начала Дата начала
Если ты правильно меня понял, то такая заготовка была бы тепло встречена на конкурсе. Многие бы хотели иметь возможность не терять данные из переменных при вынужденном прерывании шаблона. Такое вроде было в планах у самих разработчиков, вроде вызывать Bad_end при прерывании. Но я давно не отслеживал этот момент.
Вот именно. @RoyalBank не знаю почему ты скромничаешь, если ты действительно готов поделится в рамках конкурса и тебя останавливает только скромность, то это похвально конечно. Но хвала будет в разы больше если этим чудесным методом поделишься с сообществом))
 
Нужно в зенку запилить функцию запуска шаблона, после выполнения какого-либо условия! Например, ставишь 100 выполнений, и добавляешь условие, что после того как выполниться, запустить шаблон(проект определенный)! Например, 3 запуска завершились с ошибкой, запускаем шаблон(проект определенный)! Например, выполнилось 10 успешный заданий, запускаем шаблон(проект определенный)! Я так вижу эту функцию, очень удобно! Прикольная функция кстати была бы! Хочешь например получить сообщение в телегу после того как выполнилось 100 успешных, пожалуйста!
 
Нужно в зенку запилить функцию запуска шаблона, после выполнения какого-либо условия! Например, ставишь 100 выполнений, и добавляешь условие, что после того как выполниться, запустить шаблон(проект определенный)! Например, 3 запуска завершились с ошибкой, запускаем шаблон(проект определенный)! Например, выполнилось 10 успешный заданий, запускаем шаблон(проект определенный)! Я так вижу эту функцию, очень удобно! Прикольная функция кстати была бы! Хочешь например получить сообщение в телегу после того как выполнилось 100 успешных, пожалуйста!
а что стоит вывести поток отдельный в шаблоне и пусть он в цикле вечно крутится и проверяет сколько успешных, а там уже делай действия какие надо
 
Нужно в зенку запилить функцию запуска шаблона, после выполнения какого-либо условия! Например, ставишь 100 выполнений, и добавляешь условие, что после того как выполниться, запустить шаблон(проект определенный)! Например, 3 запуска завершились с ошибкой, запускаем шаблон(проект определенный)! Например, выполнилось 10 успешный заданий, запускаем шаблон(проект определенный)! Я так вижу эту функцию, очень удобно! Прикольная функция кстати была бы! Хочешь например получить сообщение в телегу после того как выполнилось 100 успешных, пожалуйста!
а кто будет определять что задание выполнилось успешно ? может оно не выполнило поставленную задачу и просто вышел шаблон.
 
а что стоит вывести поток отдельный в шаблоне и пусть он в цикле вечно крутится и проверяет сколько успешных, а там уже делай действия какие надо
это же делать надо....
 
не знаю почему ты скромничаешь, если ты действительно готов поделится
Я не скромничаю, мои познания в C# на уровне написания шаблонов в ZP. Что касается поделиться, то у меня нет готового решения. Но если я все правильно понял, то имхо, его можно сделать. Если сделаю, то выложу. Не вижу смысла ждать чего-то для этого, там простая обертка с проверкой, строк 20-30 от силы.
 
Я не скромничаю, мои познания в C# на уровне написания шаблонов в ZP. Что касается поделиться, то у меня нет готового решения. Но если я все правильно понял, то имхо, его можно сделать. Если сделаю, то выложу. Не вижу смысла ждать чего-то для этого, там простая обертка с проверкой, строк 20-30 от силы.
тебе так кажется всё просто, один запросил одну проверку, например её сделали, это ведь ни 5 минут вставить в проект зенолаба для разработчиков как нам , тем более у всех разные хотения

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

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

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

Если кто поможет допилить, буду признателен. Хотя не исключаю, что логика построенного конструкта вообще не годится для поставленной задачи... Собственно нужно правильно прописать остановку всего кода.

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");
        }
 
Если кто поможет допилить, буду признателен. Хотя не исключаю, что логика построенного конструкта вообще не годится для поставленной задачи... Собственно нужно правильно прописать остановку всего кода.

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. Единственное, бесконечный цикл настораживает. Без пауз он не будет выжирать проц?
 
а лок это чтобы другие потоки не зашли ?
 
а лок это чтобы другие потоки не зашли ?
На третий/четвертый запуск цикла for 0 < 50 и нажатии кнопки стоп, у меня крашит PM, походу весь конструкт в топку. Возможно асинхр. остановка из любой точки не моё или не взлетает идея, которая была с запуском таска в async.
 
На третий/четвертый запуск цикла for 0 < 50 и нажатии кнопки стоп, у меня крашит PM, походу весь конструкт в топку. Возможно асинхр. остановка из любой точки не моё или не взлетает идея, которая была с запуском таска в async.
этим ты мониторишь безбраузерный проект или браузерный ?
17 - я строка это что то новое или сам придумал или оно так сокращёно тоже работает, вот как я давно не посещал форум )))
 
и как понять на 3-й 4-й запуск,? типо включил один поток ждёшь а потом добавляешь потоки ?
 
17 - я строка это что то новое или сам придумал или оно так сокращёно тоже работает, вот как я давно не посещал форум )))
Это проверка для PM, на нажатый "Stop", первая проверка для ZP.

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

Вложения

Это проверка для PM, на нажатый "Stop", первая проверка для ZP.

В общем, запускаешь кубик C#, жмеш стоп, пока идет отчет. Он покажет в какой точке стопнули. Дальше если запустить кубик повторно и стоп, то у меня крашит. Подозреваю, что не закрыл таску в первой проходке. Как там приделать exception, чтобы он завершал код я х3, у меня на любом exception крашит. С таской и асинком идея скорее верная, но моя реализация походу кривая полностью.
да крашит, но я не расматривал что да как
 
Не решили эту задачу?
 
Наверно и не стоит ждать решения. А собственными силами не удалось сделать? Опишите задачу, может подскажем чего.
Пока нет. "Куча костылей придумано, которые работают честно сказать так себе." - а можно пару ссылок? А то через поиск кроме этой темы почему-то не нашел ничего.
 
Пока нет. "Куча костылей придумано, которые работают честно сказать так себе." - а можно пару ссылок? А то через поиск кроме этой темы почему-то не нашел ничего.
Есть снипет который считает глобалку. Если номер 0 то идет в одну сторону, если 1 и далее то в другую. Рабочий метод.

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

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

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