![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| MadCoder |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 478 Регистрация: 24.8.2007 Где: Москва Репутация: 1 Всего: 2 |
Добрый вечер!
Подскажите пожалуйста, как можно обновить (Application.ProcessMessages) чужое приложение? |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
Обновить (перерисовать) и заставить обработать сообщения, ожидающие в очереди - это весьма разные вещи. Что конкретно нужно? Потом - что значит "обновить чужое приложение"? Вот, например, explorer. ( не IE ! ) - у меня сейчас открыто 5 его окон ("обновляемых" независимо друг от друга), а процесс (приложение) запущен только один - explorer.exe. Какое конкретно окно из этих пяти нужно обновить? Это в Delphi все проще - все визуальные компоненты работают (должны работать) в одном потоке (mainThread). Опять-таки пример с explorer показывает, что это совсем не обязательно. Лучше опиши конкретную задачу. |
|||
|
||||
| MadCoder |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 478 Регистрация: 24.8.2007 Где: Москва Репутация: 1 Всего: 2 |
Я имел ввиду произвести Application.ProcessMessages над главной формой чужого приложения. |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
Я привел пример чужого приложения - explorer.exe с открытыми 5-ю окнами. Поясни, что считать в нем "главной формой"? Еще раз - понятие "главная форма" применимо в основном только к Delphi приложениям. |
|||
|
||||
| MadCoder |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 478 Регистрация: 24.8.2007 Где: Москва Репутация: 1 Всего: 2 |
К примеру есть приложение, которое коннектится к базе данных. Если БД не отвечает, главная форма висит и не перерисовывается. Как заставить ее перерисоваться из моего приложения?
|
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
Просто пытаюсь объяснить, что в общем случае задача не решаема - в Delphi все окна работают в одном потоке (mainThread) и метод Application.ProcessMessages благополучно обрабатывает это хозяйство, т.к. все сообщения приходят в очередь одного потока (и в этом методе "выбираются" оттуда). (примечание - это относится к визуальным компонентам, никто не мешает создать дополнительный поток и организовать в нем свою очередь сообщений, но во всех мануалах пишется, что обращаться из доп.потока к визуальным компонентам - чревато боком).
В "чужом" приложении каждое окно может быть в отдельном потоке. И принудительная выборка сообщений из одного потока никак не повлияет на другие окна. НЕТ такого понятия, как "главное окно". Добавлено через 1 минуту и 10 секунд Вот наконец-то мы пришли к конкретике. Что за приложение "коннектящееся к базе данных", на чем написано? |
|||
|
||||
| MadCoder |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 478 Регистрация: 24.8.2007 Где: Москва Репутация: 1 Всего: 2 |
Неизвестно, БД приведена для примера Вот, к пример Application.ProcessMessages:
Я так понимаю, ProcessMessages принудительно заставляет приложение обработать все сообщения, которые пришли приложению, перед выполнением следующих строчек кода. Есть ли возможность сделать подобное с чужим приложением? |
||||
|
|||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 13 Всего: 146 |
скорее всего нет , ибо если обработка одного сообщения зависла, основной цикл будет ожидать окончания обработки
Добавлено через 1 минуту и 11 секунд
а зачем его перерисовывать , если данных нету? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| MadCoder |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 478 Регистрация: 24.8.2007 Где: Москва Репутация: 1 Всего: 2 |
Чтобы пользователь его не убил, посчитав, что оно не работает. |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 15 Всего: 72 |
какой-то знакомый код Да пойми же ты, подобное даже со своим сделать не всегда возможно, к примеру, если поток "застрял" в критической секции или в WaitFor с флагом Infinite...А если "приложение зависло" - то скорее всего, там и сидит. если не возникло исключительных ситуаций, которое это "чужое приложение" подавило, дабы не пугать юзера. Сейчас посмотрел у себя в "закромах" - влезть в чужой процесс можно, но (из арсенала, который имеется у меня) - создав "свой" поток в нем. А вот как из этого "своего" потока влезть в "чужие"... |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 13 Всего: 146 |
проще будет имхо спрятать этот процесс от пользователя, но при надобности оставить доступ к нему в своем софте -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| dvamaster |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 559 Регистрация: 30.6.2004 Где: Россия : Курган Репутация: 2 Всего: 10 |
Повторюсь более детально Окно не перерисовывается из-за того, что процедура обработки сообщений окна висит (поток соотвественно тоже), так как процедура висит, то она не обработает любые сообщения находящиеся в очереди, т.е. любые мессаги посылаемые в окно не пройдут. Если перехватить процедуру обработки и запустить ее в другом потоке (это уже не безопасно, нет гарантии целосности синхронизации ), то этот новосозданный поток так же не сможет обработать сообщения. Сообщения поступают конкретному окну и потоку (), во всяком случае на NT платформах (win NT, 2k, xp и т.д., про другие не знаю). Мое заключение... Нет возможности Это сообщение отредактировал(а) dvamaster - 16.7.2009, 07:57 -------------------- Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/ Что же я сделал не так? /Король Лир/ Я делаю это для твоего же блага! /Любой родитель и палач/ PKUNZIP.ZIP /неизвестный/ |
|||
|
||||
| MadCoder |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 478 Регистрация: 24.8.2007 Где: Москва Репутация: 1 Всего: 2 |
Жаль! В любом случае всем спасибо за помощь, я узнал много нового
|
|||
|
||||
![]()
|
| Правила форума "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. |