Как управлять кол-вом потоков во время работы шаблона?

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 723
Благодарностей
1 377
Баллы
113
Приветствую.

Допустим у меня есть 50 аккаунтов некого сервиса и шаблон работает с этими аккаунтами в 50 потоков ... каждый поток в том числе проверяет не забанился ли аккант и если забанился, то удаляет его из списка аккаунтов. Как бы мне при обнаружении забаненного аккаунта так же уменьшить и кол-во потоков на 1 ? Не хочется забивать ресурс машины большим кол-вом потоков чем нужно для работы!
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 515
Благодарностей
8 702
Баллы
113
delete
 

S16er1um

Client
Регистрация
14.04.2016
Сообщения
826
Благодарностей
240
Баллы
43
Приветствую.

Допустим у меня есть 50 аккаунтов некого сервиса и шаблон работает с этими аккаунтами в 50 потоков ... каждый поток в том числе проверяет не забанился ли аккант и если забанился, то удаляет его из списка аккаунтов. Как бы мне при обнаружении забаненного аккаунта так же уменьшить и кол-во потоков на 1 ? Не хочется забивать ресурс машины большим кол-вом потоков чем нужно для работы!
берите акки со списка с удалением. вначале чекайте. если всё ок - то идите дальше и в конце шаблона кладите назад в список, если нет - складывайте в отдельный black list.
при этом список с акками будет постоянно пустой или в нём буду те акки, которые в данный момент не в работе. поставте в шаблоне выход по красной ветке после экшена"взять строку с файла" чтоб если в списке нет данных - то оно просто писало в лог какую-то инфу например " в списке данных нет" . да, конечно, лог будет загажен но вариант рабочий

П.С на случай непредвиденных обстоятельств ( падение интернета, вырубание света, шаровая молния или торнадо) лучше иметь копию списка с аккаунтами
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 723
Благодарностей
1 377
Баллы
113
берите акки со списка с удалением. вначале чекайте. если всё ок - то идите дальше и в конце шаблона кладите назад в список, если нет - складывайте в отдельный black list.
при этом список с акками будет постоянно пустой или в нём буду те акки, которые в данный момент не в работе. поставте в шаблоне выход по красной ветке после экшена"взять строку с файла" чтоб если в списке нет данных - то оно просто писало в лог какую-то инфу например " в списке данных нет" . да, конечно, лог будет загажен но вариант рабочий

П.С на случай непредвиденных обстоятельств ( падение интернета, вырубание света, шаровая молния или торнадо) лучше иметь копию списка с аккаунтами
У меня сейчас все именно так как Вы описали и работает!
Но когда из 100 аккаунтов 80 уже умерло, то какой смысл гонять все те же самые 100 потоков ... да, потоки будут пытаться брать из списка с удалением аккаунты и уходить по красной ветке и завершаться ... при этом будут забивать мне лог надписями что им не удалось взять строку из списка и будут отжирать ресурсы машины ... логично же в такой ситуации при смерти аккаунта просто уменьшать кол-во потоков на 1
 

THE CaHeK

Client
Регистрация
29.01.2016
Сообщения
293
Благодарностей
115
Баллы
43
Можно через bat файл. В зенке кликни по своему шаблону правой кнопкой мышки,выбери "создать bat файл",там дальше поставь галочку "Установить количество потоков",и поставь столько потоков,сколько у тебя аккаунтов,сохрани bat файл.Потом корректируй шаблон,что бы после бана,строка с потоками,менялась на число,живых аккаунтов,ну а потом через кубик "запуск программы" запускай bat файл
 
  • Спасибо
Реакции: Donalddick

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83

THE CaHeK

Client
Регистрация
29.01.2016
Сообщения
293
Благодарностей
115
Баллы
43

freeman

Client
Регистрация
31.07.2010
Сообщения
130
Благодарностей
138
Баллы
43
Как-то так. Только не забудь сборку System.Xml.dll поключить из GAC
Код:
lock (CommonCode.SyncObject)
{
    Guid taskId = Guid.Parse(project.TaskId);
    string taskInfo = ZennoPoster.GetTaskInfo(taskId);
                          
    System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
    doc.LoadXml("<Task>" + taskInfo + "</Task>");
                          
    System.Xml.XmlNode maxThreads = doc.SelectSingleNode("Task/ExecutionSettings/LimitOfThreads");
                          
    if (maxThreads != null)
    {
        maxThreads.InnerText = (int.Parse(maxThreads.InnerText) - 1).ToString();
                              
        System.Xml.XmlNode settingsNode = doc.SelectSingleNode("Task/ExecutionSettings");
        ZennoPoster.SetExecutionSettings(taskId, settingsNode.InnerXml);
    }                                              
}
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 723
Благодарностей
1 377
Баллы
113
Спасибо всем за ответы, буду тестить.

Но просто удивляет что на кучу реально простецких функций (которые в C# делаются одной-двумя строками и не вызывают трудностей даже у совсем новичков) есть кубики ... здесь же реально надо иметь углубленные знания по внутреннему устройству зенки, да и примеров прямо скажем не много (что уж там говорить, их почти нет) .... а кубика для управления кол-вом потоков и повторений нет. Причем просьбы о создании такого кубика поступали неоднократно и довольно давно, но разрабы по какой-то неведомой причине игнорят эту просьбу и предлагают юзать костыли. Упомяну тут @VladZen , может он увидит пост и все же добавит такую таску для разрабов! Все эти батники и сложны коды это конечно гуд, но с кубиком было бы куда проще!
 
  • Спасибо
Реакции: phirelli

Gfoblin

Client
Регистрация
30.05.2013
Сообщения
4 522
Благодарностей
991
Баллы
113
дык вроде через батник можно и в таск манагер его добавить )
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 723
Благодарностей
1 377
Баллы
113
дык вроде через батник можно и в таск манагер его добавить )
ну согласитесь что работа с кубиком мягко говоря была бы на порядок удобнее чем работа с батниками которые надо будет на лету модифицировать или каким-то мудреным кодом ... забанился акккаунт, тут же бац в кубике и уменьшили кол-во потоков ... добавились аккаунты в БД, бац и увеличили ... одно действие, простое и предельно ясное
 
  • Спасибо
Реакции: Valiksim

THE CaHeK

Client
Регистрация
29.01.2016
Сообщения
293
Благодарностей
115
Баллы
43
кому очень необходимо,разберется и с bat файлом,к тому же самому его писать не надо.А зенка сама сделает,для этого специальная функция есть.
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 723
Благодарностей
1 377
Баллы
113
кому очень необходимо,разберется и с bat файлом,к тому же самому его писать не надо.А зенка сама сделает,для этого специальная функция есть.
так можно вообще про все кубики сказать ... кому реально надо и так разберется и сделает все на c# ... или ... кому реально надо, ему и зенка вообще не нужна, он разберется и вообще на ассемблере все с нуля напишет вместе с операционной системой ;-)
 
  • Спасибо
Реакции: phirelli

THE CaHeK

Client
Регистрация
29.01.2016
Сообщения
293
Благодарностей
115
Баллы
43
так можно вообще про все кубики сказать ... кому реально надо и так разберется и сделает все на c# ... или ... кому реально надо, ему и зенка вообще не нужна, он разберется и вообще на ассемблере все с нуля напишет вместе с операционной системой ;-)
ну ты не ровняй c# в котором нужно разбираться,и bat файл в котором даже разбираться не надо.Он сам через зенку генерируется
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 956
Благодарностей
781
Баллы
113
Как-то так. Только не забудь сборку System.Xml.dll поключить из GAC
Код:
lock (CommonCode.SyncObject)
{
    Guid taskId = Guid.Parse(project.TaskId);
    string taskInfo = ZennoPoster.GetTaskInfo(taskId);
                         
    System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
    doc.LoadXml("<Task>" + taskInfo + "</Task>");
                         
    System.Xml.XmlNode maxThreads = doc.SelectSingleNode("Task/ExecutionSettings/LimitOfThreads");
                         
    if (maxThreads != null)
    {
        maxThreads.InnerText = (int.Parse(maxThreads.InnerText) - 1).ToString();
                             
        System.Xml.XmlNode settingsNode = doc.SelectSingleNode("Task/ExecutionSettings");
        ZennoPoster.SetExecutionSettings(taskId, settingsNode.InnerXml);
    }                                             
}
ваш сниппет, однозначно бы в справку, чтоб не потерялся
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 723
Благодарностей
1 377
Баллы
113
ваш сниппет, однозначно бы в справку, чтоб не потерялся
А еще лучше во встроенный кубик, которым можно было бы без дополнительных углубленных знаний с легкостью регулировать кол-во выполнений и кол-во потоков ... не понимаю почему разрабы упорно игнорят эту просьбу ... да, можно все это делать таким вот не всем очевидным кодом или мудрить с бат-файлами и их правкой на лету ... но зачем? почему просто не сделать кубик для удобной и комфортной работы?
 
  • Спасибо
Реакции: phirelli и Valiksim

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 659
Благодарностей
1 330
Баллы
113
Как-то так. Только не забудь сборку System.Xml.dll поключить из GAC
Код:
lock (CommonCode.SyncObject)
{
    Guid taskId = Guid.Parse(project.TaskId);
    string taskInfo = ZennoPoster.GetTaskInfo(taskId);
                        
    System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
    doc.LoadXml("<Task>" + taskInfo + "</Task>");
                        
    System.Xml.XmlNode maxThreads = doc.SelectSingleNode("Task/ExecutionSettings/LimitOfThreads");
                        
    if (maxThreads != null)
    {
        maxThreads.InnerText = (int.Parse(maxThreads.InnerText) - 1).ToString();
                            
        System.Xml.XmlNode settingsNode = doc.SelectSingleNode("Task/ExecutionSettings");
        ZennoPoster.SetExecutionSettings(taskId, settingsNode.InnerXml);
    }                                            
}
как сие чудо запустить?
Подключил System.Xml.dll из GAC, код вставил в кубик C# запускаю... Ошибка -
Компиляция кода Ошибка в действии "CS0103" "Имя "CommonCode" отсутствует в текущем контексте". [Строка: 0; Cтолбец: 7]
Версия зенки 5.23.0.0
И не плохо бы коментарии к коду чтоб были
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 613
Благодарностей
4 601
Баллы
113
как сие чудо запустить?
Подключил System.Xml.dll из GAC, код вставил в кубик C# запускаю... Ошибка -
Компиляция кода Ошибка в действии "CS0103" "Имя "CommonCode" отсутствует в текущем контексте". [Строка: 0; Cтолбец: 7]
Версия зенки 5.23.0.0
И не плохо бы коментарии к коду чтоб были
CommonCode - дефолтный класс из общего кода. Общий код подключен?
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 659
Благодарностей
1 330
Баллы
113
CommonCode - дефолтный класс из общего кода. Общий код подключен?
если не сложно создайте пожалуйста шаблон, подключите то что там нужно, и выложите сюда, так будет куда быстрее, это пригодится многим не только мне, а то я весь поиск перелопатил и нечего нормального по управлению потоками с C# не нашел.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 613
Благодарностей
4 601
Баллы
113
если не сложно создайте пожалуйста шаблон, подключите то что там нужно, и выложите сюда, так будет куда быстрее, это пригодится многим не только мне, а то я весь поиск перелопатил и нечего нормального по управлению потоками с C# не нашел.
в самом низу панели инструментов под пунктом "C# код" есть "Директивы using и общий код"
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 659
Благодарностей
1 330
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 613
Благодарностей
4 601
Баллы
113

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 659
Благодарностей
1 330
Баллы
113
какой код внутри общего кода?
C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary;
using ZennoLab.InterfacesLibrary.ProjectModel;
using ZennoLab.InterfacesLibrary.ProjectModel.Collections;
using ZennoLab.InterfacesLibrary.ProjectModel.Enums;
using ZennoLab.Macros;
using Global.ZennoExtensions;
using ZennoLab.Emulation;

namespace ZennoLab.OwnCode
{
    /// <summary>
    /// A simple class of the common code
    /// </summary>
    public class CommonCode
    {
        /// <summary>
        /// Lock this object to mark part of code for single thread execution
        /// </summary>
        public static object SyncObject = new object();

        // Insert your code here
    }
}
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 659
Благодарностей
1 330
Баллы
113
надо было добавить строку using System.Xml;
теперь работает)

P.S еще бы комментарий к каждой сточке кода, было бы супер)
 
Последнее редактирование:

Redsmokky

Client
Регистрация
06.10.2015
Сообщения
311
Благодарностей
195
Баллы
43
C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary;
using ZennoLab.InterfacesLibrary.ProjectModel;
using ZennoLab.InterfacesLibrary.ProjectModel.Collections;
using ZennoLab.InterfacesLibrary.ProjectModel.Enums;
using ZennoLab.Macros;
using Global.ZennoExtensions;
using ZennoLab.Emulation;

namespace ZennoLab.OwnCode
{
    /// <summary>
    /// A simple class of the common code
    /// </summary>
    public class CommonCode
    {
        /// <summary>
        /// Lock this object to mark part of code for single thread execution
        /// </summary>
        public static object SyncObject = new object();

        // Insert your code here
    }
}

А как тут понять какому шаблону ты добавишь потоков?
 

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