@sergerdn Я уже делал такие скрипты, в моём валидаторе был такой алгоритм, это пара минут уходило на подготовку, после перехода на регулярку подобный процесс стал занимать пару секунд, а нужно всего лишь рассортировать по разным почтовикам одну базу. А в этой задаче если мы говорим про 100к строк оригинальной базы с данными и перебора на ней 20к мыл уйдут часы, когда регулярка справляется за 5 минут
Вывести на экран сообщение о завершении последнего потока
-
- Можно сделать одну какую-то функцию и в нее поместить все действия
- Вызвать ее действием "Вызов функции в многопоточном режиме" в функции Main
- Учитывать что в действии "Вызов функции в многопоточном режиме" обычные переменные будут не доступны для скрипта, поэтому чтобы передавать данные можно использовать действие "глобальные переменные"
Может есть варики получше как сделать, если разбираться
-
Хотелось бы малой кровью обойтись, чтобы не переделывать старые скрипты. Сейчас глобальной переменной контролирую опустошение списка записей из первого потока, на экран посылаю сообщение об окончании, но скрипт полностью еще не завершен, т.к. эта процедура не в самом конце выполняется. А хотелось чтобы выполнить процедуру действительно в самом конце. Возможно можно добавить каждому потоку асинхронный поток для контроля, но пока не придумал как сделать.
-
Спасибо. Я попробовал код, и каждый поток выполняет этот код в конце потока. Но мою задачу до конца не решило. Мне нужно чтобы последний работающий поток выполнил это действие. Но уже хорошо, тут по крайней мере можно в глобальные переменные передавать инфу о закрытии конкретного потока, а дальше обработать.
-
PSet("basglobal", "THREADS", parseInt(JSON.parse(P("basglobal", "THREADS") || "0")) + parseInt(1)) _finnaly(function(){ var t = parseInt(JSON.parse(P("basglobal", "THREADS") || "0")) - parseInt(1); PSet("basglobal", "THREADS", t) if (t == 0) { log("LAST THREAD"); } }) -
Очень полезный скрипт, спасибо. Но мне так и не удалось реализовать мою задачу. Мне всего-навсего нужно было выполнить , например получить сообщение на экран командой винды msg /SERVER:WIN-6A3MK3B9UJJ * "Парсинг закончился". Если я допустим запускаю вручную кусок кода, то я получаю сообщение на экран и вывод логов. А если я запускаю в составе потоков, лог последний получаю правильно, а сообщение не получаю.
Вот скрипт с частью кода запуска "Запустить процесс", без него не выполнялся внешний процесс.
// Увеличиваем счетчик потоков
PSet("basglobal", "THREADS", parseInt(JSON.parse(P("basglobal", "THREADS") || "0")) + parseInt(1))_finnaly(function(){
// Уменьшаем счетчик потоков
var t = parseInt(JSON.parse(P("basglobal", "THREADS") || "0")) - parseInt(1);
PSet("basglobal", "THREADS", t);// Если это последний поток if (t == 0) { // 1. Уведомление в BAS log("Парсинг закончился"); log("LAST THREAD"); // 2. Системное уведомление Windows // Создаем временный BAT файл var batFile = "temp_msg_" + Date.now() + ".bat"; var command = 'msg /SERVER:WIN-6A3MK3B9UJJ * "Парсинг закончился"'; // Записываем BAT файл native("filesystem", "writefile", JSON.stringify({ path: batFile, value: "@echo off\r\nchcp 65001 > nul\r\n" + command, base64: false, append: false })); // Запускаем процесс native_async("processmanager", "start", JSON.stringify({ location: batFile, working_folder: "", waitfinish: true, arguments: "", version: 2 }))!; // Очищаем временный файл sleep(500)!; native("filesystem", "removefile", batFile); }})
-
@vladdr said in Вывести на экран сообщение о завершении последнего потока:
native_async
нет поддержки вызова асинхронных функций.
если скопировать модуль processmanager и сделать вызов "Синхронным" работать будет.
ProcessesSync.zipPSet("basglobal", "THREADS", parseInt(JSON.parse(P("basglobal", "THREADS") || "0")) + parseInt(1)) _finnaly(function () { var t = parseInt(JSON.parse(P("basglobal", "THREADS") || "0")) - parseInt(1); PSet("basglobal", "THREADS", t) if (t == 0) { log("LAST THREAD"); RANDOM_FILE = "temp_" + rand() + ".bat" native("filesystem", "writefile", JSON.stringify({path: RANDOM_FILE,value: "chcp 65001\r\n" + (("".length>0) ? ("cd " + "" + "\r\n") : "" ) + (("msg /SERVER:WIN-6A3MK3B9UJJ * \u0022Парсинг закончился\u0022").replace(/\r?\n/g, "\r\n")),base64:false,append:false})) log(RANDOM_FILE); var s = native("processmanager_sync", "start", JSON.stringify({location: RANDOM_FILE, working_folder: "", waitfinish: true, arguments: "", version: 2})) var ss = s.split(","); for (var k in ss) { log(base64_decode(ss[k])); } native("filesystem", "removefile", RANDOM_FILE); } })
-
@Int64 said in Вывести на экран сообщение о завершении последнего потока:
если скопировать модуль processmanager
можно не копировать, а пропатчить оригинал:
\apps\29.6.0\modules\Processes\manifest.json"exportlist": [ { "name": "start", "isasync": true, "waitinfinite": true, "workfunction": "ProcessManagerRunExe" }, { "name": "start_sync", "isasync": false, "waitinfinite": true, "workfunction": "ProcessManagerRunExe" } ]и используем:
native("processmanager", "start_sync", JSON.stringify({location: RANDOM_FILE, working_folder: "", waitfinish: true, arguments: "", version: 2})) -
Проблему удалось решить следующим образом. Получилось даже лучше.
Создаем отдельную функцию, например передачу сообщения в телегу, а далее в приведенный выше код вставляем вызов этой функции, например _call_function(SOOBSCHENIE_TELEGA,{})!;
Получился такой скриптик:PSet("basglobal", "THREADS", parseInt(JSON.parse(P("basglobal", "THREADS") || "0")) + parseInt(1))
_finnaly(function(){
var t = parseInt(JSON.parse(P("basglobal", "THREADS") || "0")) - parseInt(1);
PSet("basglobal", "THREADS", t)
if (t == 0) {
log("LAST THREAD");
_call_function(SOOBSCHENIE_TELEGA,{})!;
}
})