घर
Top.Mail.Ru Yandeks.Metrika
मंच: "शुरुआती";
वर्तमान संग्रह: 2017.12.24;
डाउनलोड करें: [xml.tar.bz2];

नीचे

धागा इसी तरह की शाखाएँ खोजें


testeruser   (2016-01-14 14:06) [0]

подскажите пожалуйста, имею потом, при создании которого устанавливаю опцию FreeOnTerminate := true;

поток отработал. но при проверке if Assigned(myThread) возвращает истину всегда.
как правильно проверять?

может как-то в самом потоке в конце обнулять, типа:
procedure execute;
  self:= nil;
अंत;

хотя проверил - то же не работает..



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;
शुरू करना
 pointerMyThread^:= nil;
समाप्त

как-то так? я никак с этими @ ^ разобраться не могу.



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);
शुरू करना
 PmyThread(myPointer)^:= nil;
अंत;

так будет работать?



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.59 एमबी
समय: 0.014 c
2-1452769577
testeruser
2016-01-14 14:06
2017.12.24
धागा


2-1453069996
vegarulez
2016-01-18 01:33
2017.12.24
ऑब्जेक्ट बनाने में त्रुटि


15-1467989201
Kilkennycat
2016-07-08 17:46
2017.12.24
जो बेहतर है, सी # या डेल्फी


2-1453318580
testeruser
2016-01-20 22:36
2017.12.24
आधार संरचना


2-1452253920
gedevan
2016-01-08 14:52
2017.12.24
कई तालिकाओं (ADO, MS Access) में sql क्वेरी कैसे करें?





अफ्रीकी अल्बानियन अरबी भाषा अर्मेनियाई आज़रबाइजानी बस्क बेलारूसी बल्गेरियाई कैटलन सरलीकृत चीनी) चीनी पारंपरिक) क्रोएशियाई चेक डेनिश डच अंग्रेज़ी एस्तोनियावासी फिलिपिनो फिनिश फ्रेंच
गैलिशियन् जॉर्जियाई जर्मन यूनानी हाईटियन यहूदी हिंदी हंगरी आइसलैंड का इन्डोनेशियाई आयरिश इतालवी जापानी कोरियाई लात्वीयावासी लिथुआनियाई मेसीडोनियन मलायी मोलतिज़ नार्वेजियन
फ़ारसी पोलिश पुर्तगाली रोमानियाई रूसी सर्बियाई स्लोवाक स्लोवेनियाई स्पेनिश स्वाहिली स्वीडिश थाई तुर्की यूक्रेनी उर्दू वियतनामी वेल्श यहूदी बंगाली बोस्नियाई
सिबुआनो एस्पेरांतो गुजराती हौसा हमोंग ईग्बो जावानीस कन्नड़ खमेर लाओ लैटिन माओरी मराठी मंगोलियन नेपाली पंजाबी सोमाली तामिल तेलुगु योरूबा
ज़ुलु
Английский Французский Немецкий Итальянский Португальский Русский Испанский