Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


AxNb ©   (2012-12-21 17:00:00) 

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

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

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 (при создании потоков)

Почему так ?


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

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

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

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


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

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


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

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


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


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

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


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

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


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

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


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

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


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


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

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


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


> AxNb ©   (21.12.12 17:00) 

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


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

Synchronize(ShowInfo);

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


AxNb   (2012-12-21 17:07:00) [11]


> потому, что 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;


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо