Не сохраняет текст в список

  • Автор темы Автор темы kolobrod
  • Дата начала Дата начала
Проблема актуально даже в 7.3. Как решается проблема?
Еще проверьте пож-ста, эта галка в свойствах списка у вас установлена?

68538
 
  • Спасибо
Реакции: ferr9918 и djaga
Да это все проверил изначально. Проблема имеет место быть когда работают два шаблона с одним файлом. Один шаблон записывает данные в файл по средством добавления строки в список, а второй шаблон берет строку с удалением с этого файла. И не важно одновременно запущены эти два шаблона или по очереди при любом исходе баг выходит через некоторое время. Через некоторое время видим такую картину - файл имеет нулевой размер (так как второй шаблон все выгреб с него), а при добавлении строк первым шаблоном мы видим типа в нем уже N количество строк добавлено хотя файл имеет нулевой размер и при его открытии он естественно пустой.
 
Да это все проверил изначально. Проблема имеет место быть когда работают два шаблона с одним файлом. Один шаблон записывает данные в файл по средством добавления строки в список, а второй шаблон берет строку с удалением с этого файла. И не важно одновременно запущены эти два шаблона или по очереди при любом исходе баг выходит через некоторое время. Через некоторое время видим такую картину - файл имеет нулевой размер (так как второй шаблон все выгреб с него), а при добавлении строк первым шаблоном мы видим типа в нем уже N количество строк добавлено хотя файл имеет нулевой размер и при его открытии он естественно пустой.
такая же жесть.
Шаблоны в многопотоке работают со списком, через стандартный кубик. в начале шаблон забирает строку с удалением, в конце работы добавляет строку. При увеличении количества потоков, список просто выгребается в ноль и не пополняется.
Данный баг был обойден отказом от стандартных кубиков работы со списками и переходом на C#. очень трудозатратная операция скажу я вам по секрету. Но зато проверено, списки нормально начали работать.

вот такая конструкция была и чем заменена:

68656


если кому нужен код , вот он.
C#:
Развернуть Свернуть Копировать
//---- входные настройки ----
string data = project.Variables["Input_Data_Akk_for_Retvit"].Value;     // данные
var list = project.Lists["Registered_Emails_for_Retvit"];                            // список для операций
var list_2 = project.Lists["Cant_Login_Registered_Emails_IMAP"];                    // список для операций
//---- действие ----
//CommonCode.Add_Data_to_Result(list, data);
lock (CommonCode.ResultDataLocker)
{
    list.Add(data);  // добавляем данные
    // ищем строку с данными и удаляем ее
    for (int i = list_2.Count-1; i >= 0 ; i-- ){
        if (list_2[i] == data) {
            list_2.RemoveAt(i);
        }
    }
    //--   
}

в общем коде надо добавить ResultDataLocker или использовать стандарт SyncObject
68658
 
такая же жесть.
Шаблоны в многопотоке работают со списком, через стандартный кубик. в начале шаблон забирает строку с удалением, в конце работы добавляет строку. При увеличении количества потоков, список просто выгребается в ноль и не пополняется.
Данный баг был обойден отказом от стандартных кубиков работы со списками и переходом на C#. очень трудозатратная операция скажу я вам по секрету. Но зато проверено, списки нормально начали работать.

вот такая конструкция была и чем заменена:

Посмотреть вложение 68656

если кому нужен код , вот он.
C#:
Развернуть Свернуть Копировать
//---- входные настройки ----
string data = project.Variables["Input_Data_Akk_for_Retvit"].Value;     // данные
var list = project.Lists["Registered_Emails_for_Retvit"];                            // список для операций
var list_2 = project.Lists["Cant_Login_Registered_Emails_IMAP"];                    // список для операций
//---- действие ----
//CommonCode.Add_Data_to_Result(list, data);
lock (CommonCode.ResultDataLocker)
{
    list.Add(data);  // добавляем данные
    // ищем строку с данными и удаляем ее
    for (int i = list_2.Count-1; i >= 0 ; i-- ){
        if (list_2[i] == data) {
            list_2.RemoveAt(i);
        }
    }
    //--  
}

в общем коде надо добавить ResultDataLocker или использовать стандарт SyncObject
Посмотреть вложение 68658
Вчера весь день потратил на то чтобы разобраться с подобной проблемой.
ZennoPoster ведет себя необъяснио. Такое ощущение, что при привязке файла к списку он изолируется от системы. Во всяком случае, шаблон на стандартных экшенах не видит изменений файла, если они производятся третьими программами.
 
Вчера весь день потратил на то чтобы разобраться с подобной проблемой.
ZennoPoster ведет себя необъяснио. Такое ощущение, что при привязке файла к списку он изолируется от системы. Во всяком случае, шаблон на стандартных экшенах не видит изменений файла, если они производятся третьими программами.
"Настройки - Выполнение", здесь ничего не менялось?

79252
 
Вчера весь день потратил на то чтобы разобраться с подобной проблемой.
ZennoPoster ведет себя необъяснио. Такое ощущение, что при привязке файла к списку он изолируется от системы. Во всяком случае, шаблон на стандартных экшенах не видит изменений файла, если они производятся третьими программами.
Сейчас протестировал в ПМ и ЗП 7.4 поведение при взятии строки спсика при изменении извне (добавление строки вручную в Нотепад++ и сохранение) - все отлично. Попробуйте на простейшем примере шаблона со взятием строки тоже протестировать, а дальше уже будем думать, что произошло и как лечить.
 
Столкнулся с такой же ситуацией.
Есть два файла, в одном лежат данные для обработки, которые берутся построчно с удалением. В другой записывается результат.
В ПМ всё работает как надо. Запускаю в зеннопостере, ничего не работает. То есть данные из файла номер 1 не удаляются и результаты в файл номер 2 не пишутся. При этом сделал специально логирование, и судя по оповещениям каждый новый запуск берёт новую строку, то есть как будто они удаляются из файла.
 
Столкнулся с такой же ситуацией.
Есть два файла, в одном лежат данные для обработки, которые берутся построчно с удалением. В другой записывается результат.
В ПМ всё работает как надо. Запускаю в зеннопостере, ничего не работает. То есть данные из файла номер 1 не удаляются и результаты в файл номер 2 не пишутся. При этом сделал специально логирование, и судя по оповещениям каждый новый запуск берёт новую строку, то есть как будто они удаляются из файла.
попробуй поставить кубик паузы после взятия строки и после записи.
 
  • Спасибо
Реакции: zoneofsoft
такая же жесть.
Шаблоны в многопотоке работают со списком, через стандартный кубик. в начале шаблон забирает строку с удалением, в конце работы добавляет строку. При увеличении количества потоков, список просто выгребается в ноль и не пополняется.
Данный баг был обойден отказом от стандартных кубиков работы со списками и переходом на C#. очень трудозатратная операция скажу я вам по секрету. Но зато проверено, списки нормально начали работать.

вот такая конструкция была и чем заменена:

Посмотреть вложение 68656

если кому нужен код , вот он.
C#:
Развернуть Свернуть Копировать
//---- входные настройки ----
string data = project.Variables["Input_Data_Akk_for_Retvit"].Value;     // данные
var list = project.Lists["Registered_Emails_for_Retvit"];                            // список для операций
var list_2 = project.Lists["Cant_Login_Registered_Emails_IMAP"];                    // список для операций
//---- действие ----
//CommonCode.Add_Data_to_Result(list, data);
lock (CommonCode.ResultDataLocker)
{
    list.Add(data);  // добавляем данные
    // ищем строку с данными и удаляем ее
    for (int i = list_2.Count-1; i >= 0 ; i-- ){
        if (list_2[i] == data) {
            list_2.RemoveAt(i);
        }
    }
    //--  
}

в общем коде надо добавить ResultDataLocker или использовать стандарт SyncObject
Посмотреть вложение 68658
Парни, можно для дураков снипет разжевать? У меня трабла со списками уже давно, файлы 100-500 гб и 10 потоков, не объяснить что происходит со списками, то не пишет, то не читает и не удаляет. Попробовал на бд переделать, там тоже свои проблемы. Можно в снипите подсказать как писать, читать и удалять строку? Версия 7.5 и мне кажется ещё долго будет нас преследовать эта проблема.
 
Столкнулся с аналогичной проблемой.

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

Ожидание: шаблон 1 записывает строку в список, путь к файлу C:\File.txt, шаблон 2 забирает строку из списка ,который ссылается на этот же файл C:\File.txt.

Реальность: рано или поздно шаблон 1 перестает записывать строку в список, шаблону 2 нечего забирать, конвейер ломается.. Если переименовать файл C:\File.txt, например C:\File1.txt, то все заработает, но ненадолго, рано или поздно проблема вернется (скорее рано).

Решение: ни один из вышеперечисленных способов мне не помог, пришлось изобретать велосипед заново. На данный момент проблему решает такой код.

C#:
Развернуть Свернуть Копировать
// Переменные для записи
string temp_email = project.Variables["temp_email"].Value;
string pass = project.Variables["pass"].Value;
string Api_key_cloudflare = project.Variables["Api_key_cloudflare"].Value;
string proxy = project.Variables["proxy"].Value;

string data_to_add = $"{temp_email}:{pass}:{Api_key_cloudflare}:{proxy}";

var list = project.Lists["Результат"];
var list_2 = project.Lists["Результат копия1"];
//записываем в 2 списка - основной и резервный. В переменных ниже - пути к файлам списков
string resultListPath = project.Variables["Result_list"].Value;
string resultList2Path = project.Variables["Result_list2"].Value;

// Функция для записи с проверкой новой строки
Action<string, IZennoList, string> writeToFile = (string path, IZennoList lst, string data) =>
{
    if (!lst.Contains(data))
    {
        lst.Add(data);
     
        if (File.Exists(path) && new FileInfo(path).Length > 0)
        {
            // Проверяем последний символ файла
            byte[] buffer = new byte[1];
            using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                fs.Seek(-1, SeekOrigin.End);
                fs.Read(buffer, 0, 1);
            }
         
            // Если последний символ не \n, добавляем новую строку перед данными
            if (buffer[0] != '\n')
            {
                File.AppendAllText(path, Environment.NewLine + data + Environment.NewLine, Encoding.UTF8);
            }
            else
            {
                File.AppendAllText(path, data + Environment.NewLine, Encoding.UTF8);
            }
        }
        else
        {
            File.AppendAllText(path, data + Environment.NewLine, Encoding.UTF8);
        }
    }
};

lock (SyncObjects.ListSyncer)
{
    writeToFile(resultListPath, list, data_to_add);
}

lock (SyncObjects.ListSyncer)
{
    writeToFile(resultList2Path, list_2, data_to_add);
}
 
Последнее редактирование:

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