![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать Ассинхронный вызов из основного потока в потокTThread
Rule © (2006-04-27 17:46:00)причем так чтобы метод выполнялся в потоке TThread, грубо говоря нада дать команду на выполнение некого метода с некоторым параметров из основного потока в не основной и дождаться пока он выполнится ...
кто чего подскажет, как это грамотней сделать ???
Rule (2006-04-28 21:24:00) [1]огромное всем спасибо, я так почиатл и действительно надо быть телепатом чтоб ответить на мой вопрос :-))), дело в том что поток из цикла останавливать нельзя так как он выполняет ещё команды из дургих потоков кроме основного, но ассинхронные ... ситуацию я разрулил, я посылаю ассинхронный запрос, и жду когда прийдет ответ в виде постмессадже ... вот и все ... чтоб не ломать существующее и не городить сложных конструкций обошелся таким решением, работает изумительно :-)))
да кстати почему именно не выполнять это в основном потоке, да потомучто в доп, потоке идет работа с привередливым ОЛЕ сервером, который реализует доступ к кассововму аппарату, а так как там схема симпл аппартмент и есть коллбек, то возникают дедлоки, с этих соображений не хочу создавать прокси в друких потоках на этот объект, а просто все разруливаю в одном потоке, а события ловлю в другом потоке, которые работают в разных аппартментах и исключают дедлоки ...
вроде попытался доступней все разъяснить ...
GrayFace (2006-04-28 11:13:00) [2]> Внук © (27.04.06 18:27) [2]
> Вероятно, нужно использовать какой-либо объект синхронизации,
> например Event, которого должен ждать главный поток.
Или Suspend/Resume. Только проблема будет, если старый приказ поток еще не вымолнил, а ему новый дают. Короче, либо очередь сообщений, либо отдельный поток для каждой процедуры. Второе предпочтительно. Если же нужно подряд отправит на выполнение N-ое кол-во действий, то весь цикл расположи в доп. потоке.
Сергей М. (2006-04-28 10:58:00) [3]
> Внук © (28.04.06 10:21) [7]
Автор, вероятно, имел ввиду, что осн.поток во время ожидания результата работы доп.потока должен реагировать на события UI.
> Rule
Если мои телепатические способности не так уж плохи, то тебе поможет MsgWaitForMultipleObjects().
Внук (2006-04-28 10:21:00) [4]>>Leonid Troyanovsky © (28.04.06 03:09) [6]
Смысла не видно сразу, разве что учебная задача :)
Leonid Troyanovsky (2006-04-28 03:09:00) [5]
> Rule © (27.04.06 17:46)
> кто чего подскажет, как это грамотней сделать ???
Выполнить оный метод в первичном потоке, и ничего
ожидать не придется.
Т.е., в данной постановке, не видно смысла в
использовании вторичного потока.
--
Regards, LVT.
Rule (2006-04-27 18:49:00) [6]Eraser © (27.04.06 18:29) [3]
да уже переделывать все некошерно, а велосипед я не придумывал а сдер у Марко Кэнту, который для меня является большим авторитетом ...
Rule (2006-04-27 18:48:00) [7]Внук © (27.04.06 18:27) [2]
о вот это идея ... спасибо, чет не подумал както сразу
Eraser (2006-04-27 18:29:00) [8]
> Rule ©
велосипеды изобретать думаю не стОит, а стОит организовать стандартную очередь сообщений, с пом. ф-ии Get/PeekMessage. И отсылать сообщения с пом. PostThreadMessage или даже создать эфимерное окно, чтобы обрабатывать синхронные сообщения, отосланные с пом. SendMessage.
Внук (2006-04-27 18:27:00) [9]Вероятно, нужно использовать какой-либо объект синхронизации, например Event, которого должен ждать главный поток.
Rule (2006-04-27 17:53:00) [10]да чуть не забыл, вот этот поток TThread находится в цикле в методе Execute и там есть TThreadList в который записываются команды, которые должен обрабатывать запрос, но это же получается ассинхронный вызов, как в существующую структуру впихнуть синхронный вызов ???