Форум работает в тестовом режиме. Все данные были перенесены со старого сайта 2018 года. Некоторая информация может быть недоступна, например вложения или хайды. Просьба сообщать о данных случаях через функционал "Жалоба", прямо под постом, где отсуствуют данные из хайда или проблемы с вложением.
Могут быть проблемы в "выкидыванием" с форума (слетевшей авторизацией). Нужно собрать статистику таких случаев.
Есть Тема, куда можете сообщить о проблемах с сайтом либо просто передать привет.

Передать параметр в потоковую процедуру. (или хотя бы как объявить ThreadVar)

wlk

Рег
8 Авг 2016
Сообщения
27
Реакции
0
По документации выглядит так:

NewThread(Proc: TThreadFunc; Parameter: Pointer = nil);


По крайней мере в 1.71 второй параметр не принимается. Пишет Too many arguments.

Нашел здесь совет использовать BeginThread (http://asiwin.com/topic/107-потоки-имитации-псевдопараллельной-работы/).

Но опять автор ничего не передает в процедуру. По документации пишут делать так:


......
Implementation

ThreadVar
msgPtr : ^TMsgRecord;

function ShowMsg(Parameter : Pointer) : Integer;
begin
Result := 0;

msgPtr := Parameter;

ShowMessagePos('Thread '+IntToStr(msgPtr.thread)+' '+msgPtr.msg,
200*msgPtr.thread, 100);

EndThread(0);
end;


Не получается объявить ThreadVar, что бы потом привести input Pointer процедуры к нужному мне типу. Получаю: "end" expected but "ThreadVar" found. Как будто не знает такого ключевого слова (может в боте используется версия делфи, в которой еще не реализована ThreadVar?). Хотя в редакторе слово подсвечивается.
Подскажите, что делать.
 
В этой теме (http://forum.lineage2bot.net/viewtopic.php?f=6&t=4586) показано, что такой подход опасен. Я так понимаю главный поток отрабатывает быстрее остальных. Может можно поставить какой-то wait екшн чтоб дождатся что все потоки выполнились. Или я уже не знаю.
 
Ну я 1 в первом посте описал.Такой случай мне выдает Too many actual parameters.
 
Я думал над этим, но это типа обходной путь получается. В итоге сделал просто в один поток пока. Пока так оставлю. Потом подумаю может хрен с ним с крешем, если оно отработает и ничего больше не упадет, кроме того потока.
 
Потому что глобальные переменные, это как минимум шареный ресурс. А значит надо постоянно следить и синхронизировать доступ к нему. Ну это уже философия пошла. Вопрос пока поставлю как решенный. Если что придумаю по этому вопросу допишу правильную версию.
 
@wlk, ну это уже зависит от конкретных задач, о которых вы ничего не сообщили. Я же не знал, что вам нужно создавать поток с параметром из других потоков. Там да, проблема синхронизации появляется, конечно.
 
Ну сегодня нет. Завтра кто знает =)
Просто есть некоторые бест практисы и глобальные переменные туда не попадают, хотя иногда упрощают жизнь.
 
@wlk, ну, не согласен, я например точно уверен, что мне никогда не понадобится в скриптах для л2 создавать потоки с параметром из других потоков. Зачем оно вам может понадобится тоже не знаю.
Бест практисы? Это просто рекомендации для новичков, а не табу.
 
я например точно уверен, что мне никогда не понадобится в скриптах для л2 создавать потоки с параметром из других потоков.
Ну я только только вьезжаю в эти скрипты. По этому пишу "со своей колокольни". Я пока не могу похвастаться такой увереностью)
Из того о чем я уже думал: организовать шареный ресурс для родительского и дочернего потока для того чтоб он служил что-то типа CancellationToken'а для дочернего потока. Пока еще смутно представляю, но что-то типа: бегут 2 бота, второй просто через атаку за первым. Первый в треде бежит с споту, второй в треде проверяет расстояние к первому. Если второй застрял/отстал надо отменить первый поток, чтоб первый бот остановился как минимум и дождался второго. Как-то так.
 
Назад
Сверху