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

Вниз

id текущего thread?   Найти похожие ветки 

 
Separator ©   (2009-11-18 12:33) [0]

Как узнать id thread"а, который вызвал мою функцию? Требуется для синхронизации с определёнными нитями.
Сразу скажу, что функция не имеет ни какого отношения к классу TThread, поэтому узнать через Self.ThreadId не получиться.


 
Separator ©   (2009-11-18 12:36) [1]

Вопрос снять, тут  же нашёл GetCurrentThreadId, хотя до этого вроде бы внимательно смотрел по этим же ключевым словам


 
Separator ©   (2009-11-18 12:47) [2]

Вопрос поставлю по другому, как синхронизировать выполнение функции с определённой нитью, если мне известен его handle или id?


 
Игорь Шевченко ©   (2009-11-18 13:02) [3]


> Вопрос поставлю по другому, как синхронизировать выполнение
> функции с определённой нитью, если мне известен его handle
> или id?


Как выполнить функцию в контексте потока, ID которого тебе известен ?

Странная задача


 
Separator ©   (2009-11-18 13:12) [4]

Попробую описать задачу:
Есть некий список (стек), в который по мере поступления добавляются пакеты данных. У списка есть свойство OnItem, если на него подписаться, то создается новая нить (некий обработчик), которая ждёт появления данных в списке и последовательно вытаскивает пакеты вызывая процедуру OnItem у списка. Так вот, если в обработчике вызывать Synchronize, то с какой нитью он будет синхронизировать? С основной приложения или с той, в контексте которой был создан список? Если 2, то тогда нечего мне заморачиваться, а если 1, то нужно синхронизировать с нить в контексте которой был создан список.
Вот такая вот запутанная задача


 
Leonid Troyanovsky ©   (2009-11-18 13:18) [5]


> Separator ©   (18.11.09 12:47) [2]

> Вопрос поставлю по другому, как синхронизировать выполнение
> функции с определённой нитью

Чего подразумевается под "синхронизировать выполнение"?

--
Regards, LVT.


 
Separator ©   (2009-11-18 13:23) [6]

Выполнить в контексте нити создавшей список


 
Leonid Troyanovsky ©   (2009-11-18 13:34) [7]


> Separator ©   (18.11.09 13:12) [4]

> Вот такая вот запутанная задача

Мы даже догадались, кто все запутал.
А Synchronize работает с первичным потоком.

Так, кто на ком стоял?
И какая, на, подписка?

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2009-11-18 13:40) [8]


> Separator ©   (18.11.09 13:23) [6]

> Выполнить в контексте нити создавшей список

А какая, на, разница, в каком?

Конечно, я могу и буквально ответить: QueueUserAPC.
Только, начать надо с консерватории.

--
Regards, LVT.


 
Игорь Шевченко ©   (2009-11-18 13:52) [9]

надо использовать TThreadList и будет тебе счастье.


 
Separator ©   (2009-11-18 14:00) [10]

TThreadList не удовлетворяет меня по своим характеристикам. Мой тоже реализует функции lock,  unlock, и еще кучу всяких нужностей. Там и мьтексы и семафоры задействованы.

Ладно, чуть перефразирую. Что делает функция Synchronize у класса TThread? В контексте какой нити будет выполняться процедура вызванная через Synchronize?


 
Игорь Шевченко ©   (2009-11-18 14:03) [11]


> В контексте какой нити будет выполняться процедура вызванная
> через Synchronize?


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


 
Separator ©   (2009-11-18 14:07) [12]

Такс.
Запускаем приложение - это 1 поток.
В контексте 1 потока создаем 2, который чего-то там делает.
Далее, 2 поток чего-то наделал и создал поток №3, ну вот нужно ему оказалось.
В 3 потоке вызывается функция MySuperFunct через Synchronize(MySuperFunct).
неужели MySuperFunct будет вызвана в контексте 1 потока?


 
Leonid Troyanovsky ©   (2009-11-18 14:08) [13]


> Separator ©   (18.11.09 14:00) [10]

> TThreadList не удовлетворяет меня по своим характеристикам.
>  Мой тоже реализует функции lock,  unlock, и еще кучу всяких
> нужностей. Там и мьтексы и семафоры задействованы.

Допустим, что семафоры. А мьютексы-то зачем?

>  В контексте какой нити будет выполняться процедура вызванная
> через Synchronize?

В первичном.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2009-11-18 14:13) [14]


> Separator ©   (18.11.09 14:07) [12]

> неужели MySuperFunct будет вызвана в контексте 1 потока?

Есть же исходники TThread.
Да и проверить очень просто: MainThreadId vs GetCurrentThreadId.

Мне даже тревожно представить, что там еще не родилось.

--
Regards, LVT.


 
Separator ©   (2009-11-18 14:13) [15]

Мьютексы для того же, для чего в TThreadList критические секции.
С помощью мьютекса реализую вход в критическую секцию, а с помощью семафора ожидание данных в списке.


 
Separator ©   (2009-11-18 14:15) [16]

такс, буду проверять


 
Игорь Шевченко ©   (2009-11-18 14:36) [17]


> Мьютексы для того же, для чего в TThreadList критические
> секции.
> С помощью мьютекса реализую вход в критическую секцию, а
> с помощью семафора ожидание данных в списке


Я сильно извиняюсь, но вроде эти объекты предназначены для синхронизации процессов, а не потоков...


 
Leonid Troyanovsky ©   (2009-11-18 14:39) [18]


> Separator ©   (18.11.09 14:13) [15]

> С помощью мьютекса реализую вход в критическую секцию, а
> с помощью семафора ожидание данных в списке.

Во, примерно такое и чудилось.

Выбрось все это, и делай наследника TThreadList,
только, семафоры тут нафик не нужны.

--
Regards, LVT.


 
Separator ©   (2009-11-18 15:06) [19]


> Игорь Шевченко ©   (18.11.09 14:36) [17]

Есть очень интересная статья, я думаю вы с не ознакомились, просто я по ней учился работать с потоко-безопасными списками.
http://forum.vingrad.ru/forum/topic-60076.html
Если там написана всякая фигня, то дайте ссылку на нормальную литературу, а так всё работает и работает просто замечательно.
Хотя конечно я могу и не правильно понять суть.


 
Separator ©   (2009-11-18 15:26) [20]

Все разобрался, синхронизация с другими потоками не нужна


 
Игорь Шевченко ©   (2009-11-18 17:08) [21]

Вот оттуда цитата:
" Если у вас есть единая программа, которая использует несколько потоков, то критическая секция - легкий и удобный способ обеспечения ваших потребностей"

цитата дальше:
"Тем не менее, при написании DLL часто возможно использование DLL несколькими разными процессами одновременно. В этом случае вы должны использовать вместо критических секций мьютексы" - это фигня, причем полная. DLL в разных процессах полностью изолированы друг от друга.


> дайте ссылку на нормальную литературу


Джеффри Рихтер, "Windows для профессионалов"


 
Separator ©   (2009-11-19 15:10) [22]

Спасибо, пошёл качать



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

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

Наверх




Память: 0.52 MB
Время: 0.009 c
15-1300391272
vajo
2011-03-17 22:47
2011.07.03
Проблема со звуком на компе.


2-1301057839
umbra
2011-03-25 15:57
2011.07.03
константные значения varType для своих вариантов


2-1301297993
aka
2011-03-28 11:39
2011.07.03
Пазлы


15-1300310991
Юрий
2011-03-17 00:29
2011.07.03
С днем рождения ! 17 марта 2011 четверг


2-1301387189
ZV
2011-03-29 12:26
2011.07.03
Как вывести значение переменной в виде символа