![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 в контексте главного потока?