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

Вниз

ThreadID всех динамических потоков почему-то всегда одинаковый.   Найти похожие ветки 

 
AxNb ©   (2012-12-21 17:00) [0]

Добрый день всем.

Есть такая ситуация:

1. Создаю к примеру 10 динамических потоков (разных - храню в Array of TThread)
2. При создании сразу пишу ThreadID (в Memo2) - чтобы иметь список ID созданных потоков.
3. В Synchronize потока выполняется  процедура "ShowInfo"


procedure TSearchThread.ShowInfo;
begin
Form1.Memo1.Lines.Add(IntToStr(CurrentThread.ThreadID));
end;


Она записывает ThreadID потока в Memo1 (как я понимаю это должен быть ID потока который вызвал процедуру в данный момент)

Но вот незадача: все ThreadID в Memo1 почему-то одинаковые ... разве не должны совпадать с ID которые были записаны в Memo2 (при создании потоков)

Почему так ?


 
RWolf ©   (2012-12-21 17:01) [1]

потому, что Synchronize выполняет метод ShowInfo в контексте главного потока?


 
AxNb ©   (2012-12-21 17:07) [2]


> потому, что Synchronize выполняет метод ShowInfo в контексте
> главного потока?


Не совсем понимаю что значит в контексте главного потока/

Привожу код "Потока"


type

TSearchThread = class(TThread)

 private

  procedure ShowInfo;
 
  protected
  procedure Execute; override;

 public

 end;

......................

procedure TSearchThread.ShowInfo;
begin

Form1.Memo1.Lines.Add(IntToStr(CurrentThread.ThreadID));

end;

...................................

procedure TSearchThread.Execute;
begin

Sleep(2000 * SleepIndex); //чтобы потоки не выполнялись одновременно а с промежутком 2 секунды

Synchronize(ShowInfo);

end;


 
Медвежонок Пятачок ©   (2012-12-21 17:08) [3]

Synchronize(ShowInfo);

Ты видишь ид главного потока


 
DVM ©   (2012-12-22 00:09) [4]


> AxNb ©   (21.12.12 17:00) 

Ты Synchronize зачем вообще вставлял? Если ответить на этот вопрос, то автоматически получишь ответ и на первоначальный.


 
Германн ©   (2012-12-22 01:44) [5]


> AxNb ©   (21.12.12 17:07) [2]
>
>
> > потому, что Synchronize выполняет метод ShowInfo в контексте
> > главного потока?
>
>
> Не совсем понимаю что значит в контексте главного потока/
>

CurrentThread "внутри" Synchronize означает главный поток приложения, а вовсе не тот доппоток, который эту процедуру вызвал.


 
Медвежонок Пятачок ©   (2012-12-22 16:24) [6]

вообще-то именно главный поток ее и вызвал.


 
Михаил   (2012-12-24 20:37) [7]

В документации написано, что метод Synchronize выполняется в главном потоке. Соответственно все ID будут одинаковые и равны ID главного потока


 
Медвежонок Пятачок ©   (2012-12-24 20:57) [8]

Synchronize как раз выполняется в том, из которого вызван.
А в данном случае он выполняется во вторичных.


 
Дмитрий С ©   (2012-12-25 03:04) [9]


> Медвежонок Пятачок ©   (24.12.12 20:57) [8]
> Synchronize как раз выполняется в том, из которого вызван.
>
> А в данном случае он выполняется во вторичных.

т.е. тормозиться главный поток до тех пор, пока не выполнится метод из параметра Synchronize? А по-моему этот метод выполняется таки в главном потоке.


 
Германн ©   (2012-12-25 03:16) [10]

Имхо, Медвежонок Пятачок уже всех запутал. :)


 
Медвежонок Пятачок ©   (2012-12-25 08:29) [11]

В чем я запутал?
метод синхронайз выполняется в том потоке, из которого он вызван. Здесь - во вторичном.
Процедура, переданная методу синкронайз в параметре выполняется в главном потоке.
Все просто как дважды два.


 
MBo ©   (2012-12-25 08:38) [12]

1. Конструктор доппотока работает в главном потоке (или в том потоке, который создаёт дополнительный поток) (это частный случай пункта 2)

2. Методы и процедуры выполняются в том потоке, из которого они вызваны

3. Исключения - методы, вызванные через Synchronize, и тело обработчика OnTerminate - они выполняются в главном потоке
(конкретная техника того, как это происходит - менялась в разных версиях Дельфи)



Страницы: 1 вся ветка

Текущий архив: 2018.03.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.009 c
15-1470764730
DayGaykin
2016-08-09 20:45
2018.03.25
Align: К вопросам на засыпку.


6-1285331229
Intranull
2010-09-24 16:27
2018.03.25
Объясните принцип работы связи в TeamViewer


2-1459952023
eh
2016-04-06 17:13
2018.03.25
Сообщение WM_DeviceChange


2-1459514237
Макака
2016-04-01 15:37
2018.03.25
Подсветка кода


15-1471469402
Юрий
2016-08-18 00:30
2018.03.25
С днем рождения ! 18 августа 2016 четверг