Текущий архив: 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.5 MB
Время: 0.004 c