![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Потоки - возможно ли? [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 + Синхронайз = маленькое западло от Борланда ... По поводу возможных замечаний на сию тему - как возражение - можно вкусно, при соответствующем приготовлении, и мухоморов отведать, и здоровым остатся. (несколько утрировано и преувеличено)