Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1453717107
Andrey K
2016-01-25 13:18
2017.12.24
Как активировать устройство подсоеденёное через роутер.


15-1467989201
Kilkennycat
2016-07-08 17:46
2017.12.24
Что лучше, C# или Delphi


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


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


2-1453318580
testeruser
2016-01-20 22:36
2017.12.24
структура базы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский