Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.12.24;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.004 c
2-1453318580
testeruser
2016-01-20 22:36
2017.12.24
структура базы


2-1452253920
gedevan
2016-01-08 14:52
2017.12.24
Как сделать sql запрос к нескольким таблицам (ADO,MS Access)?


2-1452769577
testeruser
2016-01-14 14:06
2017.12.24
Thread


2-1453717107
Andrey K
2016-01-25 13:18
2017.12.24
Как активировать устройство подсоеденёное через роутер.


2-1452956336
vegarulez
2016-01-16 17:58
2017.12.24
FastMM need help.