Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Потоки - возможно ли? [D5, D6, NT4, Win2k, WinXP]


neodiX ©   (2002-11-27 14:37:00) 

Всем привет.
Есть обьект класса TThread, в классе есть методы и переменные. Я запускаю, скажем 5 экземпляров/потоков этого класса. Теперь мне надо вызвать определеныый метод в определенном потоке, это возможно? А может есть что то типа такого TThread(findThread(thradID)).runmethod;
Если точнее, то меня интерисует можно ли зная ID потока обратится к его методам?


Digitman   (2002-11-27 16:36:00) [1]


> Ihor Osov"yak


Да это - не критика)... Не напрягайся)
На самом деле наипростейшие базовые решения в подобных ситуациях даютсмя только постоянным анализом всевозможного (близкого по логике) кода и постоянной практикой


Ihor Osov'yak   (2002-11-27 16:32:00) [2]

2 Digitman © (27.11.02 16:12)

Согласен в 99.6 проц случаев :-)

Кстати, для моего случая Ваш вариант был бы менее трудоемок.
Тормознул наверное, или опыта было маловато (это было два года назад). Ну а потом несколько раз повторил решение, не особо задумываясь. Еще раз спасибо за критику.



Кулюкин Олег   (2002-11-27 16:19:00) [3]

2 Ihor Osov"yak © (27.11.02 16:10)
> Но AllocateHWnd - тянет за собой VCL (unit forms), а это не всегда приемлимо. Это так, в плане реплики, частный случай..
Верно подмечено.

> Зы - было бы более интересно получить комментарий на Ihor Osov"yak © (27.11.02 15:59)
Его уже дали :)
См. Digitman © (27.11.02 16:12)
ИМХО, кто породил, тот и должен убивать при своей смерти.


Digitman   (2002-11-27 16:12:00) [4]


> Ihor Osov"yak


"Правильная" задача ("командующая" доп.потоком на уровне сообщений, посылаемых тем же PostThreadMessage) обязана предусматривать корректное терминирование доп.потока посылкой ему спец.сообщения (например, стандартного WM_QUIT, если цикл организован как while GetMessage(..) do..)


Ihor Osov'yak   (2002-11-27 16:10:00) [5]

2 Кулюкин Олег © (27.11.02 16:05)
Ну, значит я не совсем верно понял.

Но AllocateHWnd - тянет за собой VCL (unit forms), а это не всегда приемлимо. Это так, в плане реплики, частный случай..
Зы - было бы более интересно получить комментарий на Ihor Osov"yak © (27.11.02 15:59)


Кулюкин Олег   (2002-11-27 16:05:00) [6]

2 Ihor Osov"yak
Нет, я говорил о PostThreadMessage().

Можно и PostMessage/SendMessage без создания окна - AllocateHWnd


Ihor Osov'yak   (2002-11-27 15:59:00) [7]

Digitman © (27.11.02 15:21) В принцыпе вы в общем то правы,
но если создано окошко, то при снятии задачи окошко получит WM_Close и иже с ним и у нас будет возможность корректно завершить поток его же средствами ... Для безоконного потока я не уверен, что такая возможность существует. Или я снова не прав? (вообще, на досуге посмотрю - во всяком случае спасибо за критическое замечание).


Digitman   (2002-11-27 15:21:00) [8]


> Ihor Osov"yak


На кой черт код.потоку окно какое-то создавать ради этого ? Код.поток и сам может принимать/обрабатывать сообщения, посланные ему в PostThreadMessage()


Ihor Osov'yak   (2002-11-27 15:12:00) [9]

2 neodiX © (27.11.02 15:04)

Олег наверно имел ввиду цыкл выборки сообщений, а под сообщением - виндозное сообщение, посланное через PostMessage..
Зы, не забудьте также создать окошко с оконной процедурой.

Зы 2 - если будут проблемы - пишите osi_тут_собака_osi.te.ua - у меня есть аналогичное решение (поток+окошко+цыкл, причем без юзания vcl) - может и поделюсь... Сюда постить - много места займет...


neodiX   (2002-11-27 15:04:00) [10]

2 Кулюкин Олег
Блин, это может быть то что надо.


Кулюкин Олег   (2002-11-27 15:00:00) [11]

Посылайте сообщение потоку, а в потоке напишите обработцик, который будет звать нужный метод.


neodiX   (2002-11-27 14:58:00) [12]

Понимаете есть такая тема: запускается 5 потоков, в которых происходит соединение с удоленными серверами (для каждого соединения разный сервер). Соеденение произошло. Теперь я хочу воспользоватся одним потоком, ну т.е. клиентом и отаслать серверу мессагу. Жму кнопку и ... есть список ID всех потоков которые я создал, как по ID обратится к определеному клиенту/потоку, т.е. получается что я выполняю это действие в контекст основного потока своей проги.


Виктор Щербаков   (2002-11-27 14:45:00) [13]


> Теперь мне надо вызвать определеныый метод в определенном
> потоке, это возможно?

Возможно, только непонятно в контексте какого потока ты хочешь вызывать методы потомка TThread.


Ihor Osov'yak   (2002-11-27 14:44:00) [14]

TThread - класс - оболочка над потоком. В контексте потока выполняется только execute и то, что с него вызвано (прямо, не через синхронайз).

TThread(findThread(thradID)).runmethod вызовет runmethod в контексте того потока, где сделан вызов TThread(findThread(thradID)).runmethod, а не в контексте того потока, который соответствует thradID.

Зы (имхо) TThread + Синхронайз = маленькое западло от Борланда ... По поводу возможных замечаний на сию тему - как возражение - можно вкусно, при соответствующем приготовлении, и мухоморов отведать, и здоровым остатся. (несколько утрировано и преувеличено)


Наверх

Титульная страница Поиск, карта сайта Написать письмо