Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1356094804
AxNb
2012-12-21 17:00
2018.03.25
ThreadID всех динамических потоков почему-то всегда одинаковый.


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


4-1286460623
OlegSkal
2010-10-07 18:10
2018.03.25
Имя пользователя


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


4-1287656966
Zheksonz
2010-10-21 14:29
2018.03.25
Как определить находится ли Windows в режим выбора пользователя.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский