![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: нет Всего: 3 |
Как мы знаем вызов Application.ProcessMessages приводит к тому что происходит обработка очереди сообщений того потока в котором собственно вызывался. У меня вопрос как в Delphi можно заставить подобную ф-цию произвести обработку сообщения в контексте заданного потока т.е. как то так:
Нужно мне собственно для того, чтобы можно было выполнить такую вещь: MainThread (главный поток) cоздает ChildThread(дочерний поток), и далее MainThread начинает выполнять долгую операцию. ChildThread(дочерний поток) - это по сути у меня окно в котором показывается время выполнения действия + какая-нить красивая анимация + ProgressBar и т.п. Это окно у меня используется во многих местах программы с разными MainThread'ами так вот чтобы у пользователя не было ощущения что прога повисла делаем Application.ProcessMessages т.е. -----------------------memory MainThread1---------------------- код инициализирующий ChildThread т.е. создание красивого окна ожидания ShowWinWait в отдельном потоке какой код выполняющий в цикле сложные операции for i := .. to .. do Application.ProcessMessages ----------------------------------------------------------------------- -----------------------memory MainThread2---------------------- код инициализирующий ChildThread т.е. создание красивого окна ожидания ShowWinWait в отдельном потокекакой код выполняющий сложные операции Application.ProcessMessages ----------------------------------------------------------------------- -----------------------memory MainThread3---------------------- код инициализирующий ChildThread т.е. создание красивого окна ожидания ShowWinWait в отдельном потокекакой код выполняющий сложные операции Application.ProcessMessages ----------------------------------------------------------------------- Как вы заметели приходиться в MainThread'ах вызывать Application.ProcessMessage это не очень удобно проще было бы так -----------------------memory MainThread1---------------------- код инициализирующий ChildThread т.е. создание красивого окна ожидания с параметрами ShowWinWait(MainTID), где MainTID = GetWindowThreadProcessId (Self.Handle, lpdwProcessId) - id MainThread1 какой код выполняющий в цикле сложные операции for i := .. to .. do ----------------------------------------------------------------------- ------------------------memory ChildThread---------------------- здесь собственно код отображающие ProgressBar и т.д. procedure OnTimerTime begn .... Application.ProcessMessages(MainTID); end; ------------------------------------------------------------------------ -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
ай жесть... ты еще наверное форму в доп.потоке создаешь?
-------------------- There are always someone smarter than you... |
|||
|
||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: нет Всего: 3 |
Хорошо объясню более кратко (хотел подробно не получилось): MainThread - собственно главный поток. WinWait - окно в котором отображается ProgressBar + анимация и т.п, данное окно содержит JVCL Timer который работает в отдельном потоке (TimerThread) и генерит событие OnTimer на это событие повешена ф-ция, которая управляет ProgressBar'ом анимацией и прочей фигней, в нее же мне надо разместить ф-цию типа Application.ProcessMessages(MainThreadID) для обновления очереди сообщения главного потока, если же я там размещу просто Application.ProcessMessages, то будет производиться обработка очереди сообщений потока TimerThread, вот почему мне нужна ф-ция типа Application.ProcessMessages(MainThreadID) -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
т.е. ты из доп.потока обращаешься к компонентам на форме, да еще и ProcessMessages хочешь вызвать?
-------------------- There are always someone smarter than you... |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 7 Всего: 158 |
Delphist, чтобы программа не "умирала", должен быть свободен основной поток.
т.е. в доп.поток нужно уносить как раз длительные операции. работа с визуальными компонентами должна производиться только из основного потока. из доп.потоков "формы" придется рисовать "руками", на winapi. |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 3 Всего: 108 |
Delphist, чтоб прога не "зависала" от частых обращений к визуальным компанентам на форме, нужно эти обращения проредить))) например обращаться не каждый раз, а например каждый десятый... или каждую секунду... ))
-------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |