Скопировать файл перед началом работы многопоточного шаблона

Zellweger

Client
Регистрация
14.12.2022
Сообщения
20
Благодарностей
4
Баллы
3
Здравствуйте! Есть два текстовых файла, их нужно каждый раз копировать перед запуском проекта. Через кубик "скопировать файл" возникает проблема, когда проект запускается в многопоточном режиме, выскакивает ошибка- работа с файлом уже ведётся. Шаблон запускается каждый день, нужно,чтобы перед началом его работы два файла уже были созданы. Как лучше сделать это?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 694
Баллы
113

izubr

Client
Регистрация
11.05.2011
Сообщения
521
Благодарностей
219
Баллы
43
делать работу с файлами на C# и блокировку файла прописать. за деталями-кодом не ко мне. просто идея.
ну по крайней на php так работает.
 
  • Спасибо
Реакции: Zellweger

Deisler

Client
Регистрация
26.10.2019
Сообщения
483
Благодарностей
183
Баллы
43
Если надо копировать файлы один раз в сутки, что бы это делал только один шаблон, то я бы делал запись в отдельном файле после копирования что файлы были скопированы. Файл можно сделать с сегодняшней датой. Другие потоки ищут этот файл, в котором есть отметка о том что файлы сегодня уже были скопированы. Если не находят, то первый поток, который это обнаружил копирует нужные файлы и создает файл "метку". Другие шаблоны при обнаружении файла "метки" пропускают этап копирования и переходят к самой работе.

На случай ошибки на моменте что один поток еще копирует файлы и второй тоже хочет, и ливит ошибку из-за работы другого потока - по выходу ошибки ставим паузу секунд 5 и снова проверяем наличае файла "метки" (только не создайте новый кубик проверки, что бы точно исключить зацикливание в проекте)

И так же я бы прописал при наступлении новых суток проверки наличая файла "метки" за вчера. Что бы удалить его.


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



Второй вариант - создать отдельный шаблон, который будет запускаться по расписанию раньше основного и уже копировать нужные файлы
 
  • Спасибо
Реакции: Zellweger и Alexmd

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 387
Баллы
113
"Лучше создать эти файлы с вечера."
Логика создания файлов по окончании работы последнего потока проще, чем в начале, где надо стопать все потоки, лочить файлы и потом опять их запускать, или чем вообще делать отдельный шаблон.
 
  • Спасибо
Реакции: Zellweger и Deisler

Zellweger

Client
Регистрация
14.12.2022
Сообщения
20
Благодарностей
4
Баллы
3
Господа, протестировал разные варианты, и вначале проекта, и после. Везде одна ошибка - взаимодействие с файлом невозможно, т.к. его использует другой поток. Если проверять наличие и копировать файл в конце работы проекта, то есть риск просто зациклить проект. Нужный файл удаляется и вновь копируется разными потоками.
Похоже, самый простой и действенный вариант - создание второго шаблона для копирования файла. Всем спасибо за ваши ответы!
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 387
Баллы
113
В конце это можно сделать как-то так:
добавляю lock на всякий случай, чтобы не упустить момент, вдруг шаблоны работают супер-синхронно и одновременно заканчивают работу.
C#:
//этот кубик должен быть завершающим в проекте и иметь на выходе только красную ветку, чтобы не портить впечатление о проекте в логе
lock(CommonCode.SyncObject)//чтобы это работало, в проект должны быть добавлены "Директивы using и Общий код"
{
    Thread.Sleep(5000);//Можно поэкспериментировать с этой паузой. Вдруг постер при супер-синхронном окончании работы нескольких потоков не сумеет корректно получить данные о количестве своих работающих потоков
    if(ZennoPoster.GetThreadsCount(Guid.Parse(project.TaskId)) > 1)
    {
        project.SendInfoToLog("После меня еще будут ребята, потому трогать файлы не буду.");
        return true;
    }
    else
    {
        project.SendInfoToLog("Я последний поток. Копирую файлы");
    }
}
//зеленая ветка не нужна. Кубик уйдет на GoodEnd, что означает успешное завершение проекта, а оно ведь таким и является - просто не всем можно трогать заветные файлы
//красная ветка должна вести к кубикам, которые копируют файлы.
На практике не проверял. Это лишь теория
 
  • Спасибо
Реакции: volody00

Deisler

Client
Регистрация
26.10.2019
Сообщения
483
Благодарностей
183
Баллы
43
Господа, протестировал разные варианты, и вначале проекта, и после. Везде одна ошибка - взаимодействие с файлом невозможно, т.к. его использует другой поток. Если проверять наличие и копировать файл в конце работы проекта, то есть риск просто зациклить проект. Нужный файл удаляется и вновь копируется разными потоками.
Похоже, самый простой и действенный вариант - создание второго шаблона для копирования файла. Всем спасибо за ваши ответы!
Ну так ошибка то возникла в каком кубике ? От этого кубика сделайте выход по красной ветке и паузу в 5 секунд (или столько, сколько требуется для копирования файлов другим потоком). После проверку на то появлился ли файл "метка" И продолжение работы, если появился.
 

Zellweger

Client
Регистрация
14.12.2022
Сообщения
20
Благодарностей
4
Баллы
3
В конце это можно сделать как-то так:
добавляю lock на всякий случай, чтобы не упустить момент, вдруг шаблоны работают супер-синхронно и одновременно заканчивают работу.
C#:
//этот кубик должен быть завершающим в проекте и иметь на выходе только красную ветку, чтобы не портить впечатление о проекте в логе
lock(CommonCode.SyncObject)//чтобы это работало, в проект должны быть добавлены "Директивы using и Общий код"
{
    Thread.Sleep(5000);//Можно поэкспериментировать с этой паузой. Вдруг постер при супер-синхронном окончании работы нескольких потоков не сумеет корректно получить данные о количестве своих работающих потоков
    if(ZennoPoster.GetThreadsCount(Guid.Parse(project.TaskId)) > 1)
    {
        project.SendInfoToLog("После меня еще будут ребята, потому трогать файлы не буду.");
        return true;
    }
    else
    {
        project.SendInfoToLog("Я последний поток. Копирую файлы");
    }
}
//зеленая ветка не нужна. Кубик уйдет на GoodEnd, что означает успешное завершение проекта, а оно ведь таким и является - просто не всем можно трогать заветные файлы
//красная ветка должна вести к кубикам, которые копируют файлы.
На практике не проверял. Это лишь теория
Не понял, как кубик поймёт,какой именно файл нужно копировать.


Ну так ошибка то возникла в каком кубике ? От этого кубика сделайте выход по красной ветке и паузу в 5 секунд (или столько, сколько требуется для копирования файлов другим потоком). После проверку на то появлился ли файл "метка" И продолжение работы, если появился.
Это не наш метод. Хотелось бы,чтобы ошибки вообще не возникало.


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

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 387
Баллы
113
Забыл в кубик добавить выход по красной ветке)
C#:
//этот кубик должен быть завершающим в проекте и иметь на выходе только красную ветку, чтобы не портить впечатление о проекте в логе
lock(CommonCode.SyncObject)//чтобы это работало, в проект должны быть добавлены "Директивы using и Общий код"
{
    Thread.Sleep(5000);//Можно поэкспериментировать с этой паузой. Вдруг постер при супер-синхронном окончании работы нескольких потоков не сумеет корректно получить данные о количестве своих работающих потоков
    if(ZennoPoster.GetThreadsCount(Guid.Parse(project.TaskId)) > 1)
    {
        project.SendInfoToLog("После меня еще будут ребята, потому трогать файлы не буду.");
        return true;
    }
    else
    {
        project.SendInfoToLog("Я последний поток. Копирую файлы");
        throw new Exception();
    }
}
//зеленая ветка не нужна. Кубик уйдет на GoodEnd, что означает успешное завершение проекта, а оно ведь таким и является - просто не всем можно трогать заветные файлы
//красная ветка должна вести к кубикам, которые копируют файлы.
Не понял, как кубик поймёт,какой именно файл нужно копировать.
Да откуда ж ему или мне знать.. Вы там копируете че-то, а че, как и зачем - неизвестно. Кубик - это лишь развилка, которая определяет последний оставшийся рабочим поток и позволяет при обнаружении задать отправить шаблон по определенному сценарию.
 

legorange

Client
Регистрация
22.04.2020
Сообщения
13
Благодарностей
34
Баллы
13
I use a global variable, creating or deleting it via its Invoked method;

object magicClassObjectDeleteVar = project.GlobalVariables.GetType().GetMethod("DeleteVariable").Invoke(project.GlobalVariables,new object[]{"[email protected]"});

Project 1 has one thread and when it finishes it calls project 2 with 20 threads, it does what it should, and the first thread that detects that there are no more tasks closes the project and calls project 1 again, and so on.
 

Вложения

  • Спасибо
Реакции: BAZAg и Alexmd

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