Всем еще раз привет. Вопрос решился. Помог мне с этим Виктор. Короче говоря, каким то образом у винды которая ставиться на китайскую материнку есть ограничения в плане колличества загружаемых строк в бас. То есть. У меня были ключевые слова для поиска. Их был 1 млн. В итоге получается урезал до 150к Софт работает как часы. Может кому то пригодится.
Получается что китайские материнки имеею или слабую обработку или кэш или еще что то. Вообщем я не силен в этом. Но что то не так. Пока и так работает меня полностью Устраивает. Теперь можно крутить бас в 500 + потоков. Всем спасибо. Тему можно закрывать.
Вывести на экран сообщение о завершении последнего потока
-
- Можно сделать одну какую-то функцию и в нее поместить все действия
- Вызвать ее действием "Вызов функции в многопоточном режиме" в функции 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,{})!;
}
})