Форум: "Начинающим";
Текущий архив: 2017.12.24;
Скачать: [xml.tar.bz2];
ВнизThread Найти похожие ветки
← →
testeruser (2016-01-14 14:06) [0]подскажите пожалуйста, имею потом, при создании которого устанавливаю опцию FreeOnTerminate := true;
поток отработал. но при проверке if Assigned(myThread) возвращает истину всегда.
как правильно проверять?
может как-то в самом потоке в конце обнулять, типа:
procedure execute;
self:= nil;
end;
хотя проверил - то же не работает..
← →
testeruser (2016-01-14 14:21) [1]как выход решил повесить на OnTerminate процедуру, в которой будет обнулять переменную.
можно как-то назначить regular процедуру?
или как её можно объявить в простом модуле? не методом формы.
← →
Игорь Шевченко © (2016-01-14 14:40) [2]
> как правильно проверять?
Никак. Использование FreeOnTerminate подразумевает, что тебе неинтересно, что происходит с потоком после его запуска.
Если надо проверять, то не надо использовать FreeOnTerminate.
← →
testeruser (2016-01-14 15:23) [3]мне то не интересно, но мне и не нужно запускать второй поток если не отработал первый.
да и второй запуск отложенный. и не хотелось, что бы без FreeOnTerminate висел в памяти отработанный поток.
может как-то на создание потока передавать указатель на переменную этого потока.
потом уже в потоке при onterminate обнулять.
myThread: TmyThread.create(@myThread)
..
OnTerminate;
begin
pointerMyThread^:= nil;
end
как-то так? я никак с этими @ ^ разобраться не могу.
← →
testeruser (2016-01-14 15:30) [4]PmyThread = ^TmyThread;
myThread:= TmyThread.Create(@myThread);
..
procedure create(val: pointer);
myPointer := val;
OnTerminate := OnThreadTerminated;
...
procedure OnThreadTerminated(sender: TObject);
begin
PmyThread(myPointer)^:= nil;
end;
так будет работать?
← →
DVM © (2016-01-14 15:43) [5]
> testeruser (14.01.16 15:23) [3]
Не правильный подход ты выбрал. Не надо стартовать и запускать потоки. Используй пул потоков по числу ядер процессора. Оперировать надо задачами, которые кладутся в очередь или общую для пула потоков (с синхронизацией) или непосредственно в очередь конкретного потока. Выполнив очередную задачу поток засыпает в ожидание следующей.
И имхо лучше не использовать эту фичу "FreeOnTerminate", лучше контролировать все ресурсы самостоятельно.
← →
testeruser (2016-01-14 16:14) [6]DVM ©, а пример можно или почитать где насчет как на определенном ядре запустить поток?
где-то была у меня omnithread библиотека. но для простого приложения хотелось бы попроще что-то.
да и мне кажется, что с вашим пулом потоков только багов кучу наделаю ))
← →
DVM © (2016-01-15 11:34) [7]
> testeruser (14.01.16 16:14) [6]
> а пример можно или почитать где насчет как на определенном
> ядре запустить поток?
SetThreadAffinityMask()
https://msdn.microsoft.com/en-us/library/windows/desktop/ms686247%28v=vs.85%29.aspx
но 100% гарантий это не дает, это лишь просьба к системе использовать выбранное ядро.
← →
jack128 © (2016-01-15 22:04) [8]
> но мне и не нужно запускать второй поток если не отработал
> первый.var InThread: Integer = 0;
procedure TForm3.Button1Click(Sender: TObject);
var
Thread: TThread;
begin
if InterlockedCompareExchange(InThread, 1, 0) <> 0 then Exit;
Thread := TThread.CreateAnonymousThread(procedure
begin
try
// do work
finally
InThread := 0;
end;
end);
Thread.Start;
end;
← →
Игорь Шевченко © (2016-01-16 10:18) [9]jack128 © (15.01.16 22:04) [8]
Ужас
← →
Andy BitOff © (2016-01-17 14:07) [10]
> jack128 © (15.01.16 22:04) [8]
ну если при таких условиях, то я бы так написал:procedure TForm3.Button1Click(Sender: TObject);
var
Thread: TThread;
begin
Button1.Enabled := False;
Thread := TThread.CreateAnonymousThread(procedure
begin
try
// do work
finally
TThread.Synchronize(nil, procedure begin Button1.Enabled := True; end);
end;
end);
Thread.Start;
end;
> Игорь Шевченко © (16.01.16 10:18) [9]
> Ужас
Да не, норм, чо. Просто без фанатизма.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2017.12.24;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.001 c