![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
id текущего thread?
Separator © (2009-11-18 12:33:00)Как узнать id thread'а, который вызвал мою функцию? Требуется для синхронизации с определёнными нитями.
Сразу скажу, что функция не имеет ни какого отношения к классу TThread, поэтому узнать через Self.ThreadId не получиться.
Separator (2009-11-19 15:10:00) [1]Спасибо, пошёл качать
Игорь Шевченко (2009-11-18 17:08:00) [2]Вот оттуда цитата:
" Если у вас есть единая программа, которая использует несколько потоков, то критическая секция - легкий и удобный способ обеспечения ваших потребностей"
цитата дальше:
"Тем не менее, при написании DLL часто возможно использование DLL несколькими разными процессами одновременно. В этом случае вы должны использовать вместо критических секций мьютексы" - это фигня, причем полная. DLL в разных процессах полностью изолированы друг от друга.
> дайте ссылку на нормальную литературу
Джеффри Рихтер, "Windows для профессионалов"
Separator (2009-11-18 15:26:00) [3]Все разобрался, синхронизация с другими потоками не нужна
Separator (2009-11-18 15:06:00) [4]
> Игорь Шевченко © (18.11.09 14:36) [17]
Есть очень интересная статья, я думаю вы с не ознакомились, просто я по ней учился работать с потоко-безопасными списками.
http://forum.vingrad.ru/forum/topic-60076.html
Если там написана всякая фигня, то дайте ссылку на нормальную литературу, а так всё работает и работает просто замечательно.
Хотя конечно я могу и не правильно понять суть.
Leonid Troyanovsky (2009-11-18 14:39:00) [5]
> Separator © (18.11.09 14:13) [15]
> С помощью мьютекса реализую вход в критическую секцию, а
> с помощью семафора ожидание данных в списке.
Во, примерно такое и чудилось.
Выбрось все это, и делай наследника TThreadList,
только, семафоры тут нафик не нужны.
--
Regards, LVT.
Игорь Шевченко (2009-11-18 14:36:00) [6]
> Мьютексы для того же, для чего в TThreadList критические
> секции.
> С помощью мьютекса реализую вход в критическую секцию, а
> с помощью семафора ожидание данных в списке
Я сильно извиняюсь, но вроде эти объекты предназначены для синхронизации процессов, а не потоков...
Separator (2009-11-18 14:15:00) [7]такс, буду проверять
Separator (2009-11-18 14:13:00) [8]Мьютексы для того же, для чего в TThreadList критические секции.
С помощью мьютекса реализую вход в критическую секцию, а с помощью семафора ожидание данных в списке.
Leonid Troyanovsky (2009-11-18 14:13:00) [9]
> Separator © (18.11.09 14:07) [12]
> неужели MySuperFunct будет вызвана в контексте 1 потока?
Есть же исходники TThread.
Да и проверить очень просто: MainThreadId vs GetCurrentThreadId.
Мне даже тревожно представить, что там еще не родилось.
--
Regards, LVT.
Leonid Troyanovsky (2009-11-18 14:08:00) [10]
> Separator © (18.11.09 14:00) [10]
> TThreadList не удовлетворяет меня по своим характеристикам.
> Мой тоже реализует функции lock, unlock, и еще кучу всяких
> нужностей. Там и мьтексы и семафоры задействованы.
Допустим, что семафоры. А мьютексы-то зачем?
> В контексте какой нити будет выполняться процедура вызванная
> через Synchronize?
В первичном.
--
Regards, LVT.
Separator (2009-11-18 14:07:00) [11]Такс.
Запускаем приложение - это 1 поток.
В контексте 1 потока создаем 2, который чего-то там делает.
Далее, 2 поток чего-то наделал и создал поток №3, ну вот нужно ему оказалось.
В 3 потоке вызывается функция MySuperFunct через Synchronize(MySuperFunct).
неужели MySuperFunct будет вызвана в контексте 1 потока?
Игорь Шевченко (2009-11-18 14:03:00) [12]
> В контексте какой нити будет выполняться процедура вызванная
> через Synchronize?
в контексте основного потока, об чем написано в комментариях, которые вставляет в код среда при создании нового наследника TThread, ну и в справке
Separator (2009-11-18 14:00:00) [13]TThreadList не удовлетворяет меня по своим характеристикам. Мой тоже реализует функции lock, unlock, и еще кучу всяких нужностей. Там и мьтексы и семафоры задействованы.
Ладно, чуть перефразирую. Что делает функция Synchronize у класса TThread? В контексте какой нити будет выполняться процедура вызванная через Synchronize?
Игорь Шевченко (2009-11-18 13:52:00) [14]надо использовать TThreadList и будет тебе счастье.
Leonid Troyanovsky (2009-11-18 13:40:00) [15]
> Separator © (18.11.09 13:23) [6]
> Выполнить в контексте нити создавшей список
А какая, на, разница, в каком?
Конечно, я могу и буквально ответить: QueueUserAPC.
Только, начать надо с консерватории.
--
Regards, LVT.
Leonid Troyanovsky (2009-11-18 13:34:00) [16]
> Separator © (18.11.09 13:12) [4]
> Вот такая вот запутанная задача
Мы даже догадались, кто все запутал.
А Synchronize работает с первичным потоком.
Так, кто на ком стоял?
И какая, на, подписка?
--
Regards, LVT.
Separator (2009-11-18 13:23:00) [17]Выполнить в контексте нити создавшей список
Leonid Troyanovsky (2009-11-18 13:18:00) [18]
> Separator © (18.11.09 12:47) [2]
> Вопрос поставлю по другому, как синхронизировать выполнение
> функции с определённой нитью
Чего подразумевается под "синхронизировать выполнение"?
--
Regards, LVT.
Separator (2009-11-18 13:12:00) [19]Попробую описать задачу:
Есть некий список (стек), в который по мере поступления добавляются пакеты данных. У списка есть свойство OnItem, если на него подписаться, то создается новая нить (некий обработчик), которая ждёт появления данных в списке и последовательно вытаскивает пакеты вызывая процедуру OnItem у списка. Так вот, если в обработчике вызывать Synchronize, то с какой нитью он будет синхронизировать? С основной приложения или с той, в контексте которой был создан список? Если 2, то тогда нечего мне заморачиваться, а если 1, то нужно синхронизировать с нить в контексте которой был создан список.
Вот такая вот запутанная задача
Игорь Шевченко (2009-11-18 13:02:00) [20]
> Вопрос поставлю по другому, как синхронизировать выполнение
> функции с определённой нитью, если мне известен его handle
> или id?
Как выполнить функцию в контексте потока, ID которого тебе известен ?
Странная задача