Форум: "Основная";
Текущий архив: 2018.03.25;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.002 c