Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2011.07.03;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.004 c
1-1258536836
Separator
2009-11-18 12:33
2011.07.03
id текущего thread?


15-1300397390
Юрий
2011-03-18 00:29
2011.07.03
С днем рождения ! 18 марта 2011 пятница


15-1298638136
>|<
2011-02-25 15:48
2011.07.03
Разработка универсального логгера всех действий на форме


2-1301073992
awer
2011-03-25 20:26
2011.07.03
Не работает SetTimer ((


15-1300381955
dreamse
2011-03-17 20:12
2011.07.03
Прошу оценить созданный продукт - сетевой экран.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский