![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Caduser |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 2.10.2006 Где: г. Хабаровск Репутация: 1 Всего: 1 |
Есть основная форма, в ней происходит вызов функции которая выполняется долго и естественно блокирует весь интерфейс. Задача: поместить функцию в поток, так чтобы основной интерфейс не блокировался НО ОЖИДАЛ окончания выполнения функции.
В основной форме:
Описание потока и функции:
Этот вариант не годится, т.к. WaitFor опять таки все блокирует! Как ожидать окончание выполнения функции? (читал много мотериалов но описание подобного применения потоков не нашел) Это сообщение отредактировал(а) Caduser - 15.1.2007, 07:18 |
||||
|
|||||
aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
Это сообщение отредактировал(а) aktuba - 15.1.2007, 08:03 -------------------- ![]() |
|||
|
||||
Caduser |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 2.10.2006 Где: г. Хабаровск Репутация: 1 Всего: 1 |
Действительно работает. Однако не приводит ли этот цикл к дополнительной загрузке процессора (так мне показалось при тестировании)? Может есть какой-нибудь более эффективный способ (пусть даже не простой)? Это сообщение отредактировал(а) Caduser - 15.1.2007, 10:21 |
|||
|
||||
aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
Нет, не приводит. Эта строка просто заставляет обрабатывать все сообщения.
Только учти один момент - если функция из потока вернет пустую строку, то код дальше исполняться не будет... Это сообщение отредактировал(а) aktuba - 15.1.2007, 10:28 -------------------- ![]() |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
а не правильнее ли сделать "событие" на завершение работы потока и считать результат?!
просто в приведенном примере смысл отдельного потока теряется абсолютно. могли бы и в главном тоже самое делать. как лучше сделать: при старте доп.потока выставляете флаг в главном потоке, что идет обработка данных. по оконачнии работы доп.потока сбрасываете флаг и считывать результат. ну или вместо флага просто можно выставлять доступность действий/контролов. -------------------- There are always someone smarter than you... |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Просто, при завершении работы треда, вызвать нужный метод синхронизацией
|
|||
|
||||
aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
MetalFan, Snowy, а какой смысл использовать поток в данной задаче? какой вопрос - такой ответ...
-------------------- ![]() |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
|
|||
|
||||
Caduser |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 2.10.2006 Где: г. Хабаровск Репутация: 1 Всего: 1 |
Уточняю суть задачи. Тело функции это запрос к базе через DCOM:
Выполнение этого запроса в главном потоке приводит к полной блокировке интерфейса (Application.ProcessMessages вставлять тут естественно некуда). Единственный выход - поместить DCOM.AppServer.MyFunc1 в отдельный поток, однако выполнение основной программы должно быть приостановлено до завершения выполнения этого потока. |
||||
|
|||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
так, тогда зачем еще один поток? у тебя и так "приостановится" главный поток, пока не выполнится данная функция ;) наверное ты имел ввиду не полную "приостановку", а просто блокировку части GUI до завершения операции? тогда правильнее, имхо, сделать нотфикацию форме после завершения выполнения функции в трэде... а перед созданием оного блокируй часть контролов. это будет правильнее, чем крутиться в цикле с ProcessMessages, проверяя состояние доп.потока в общем смотри, пример уже дали ;) Это сообщение отредактировал(а) MetalFan - 16.1.2007, 09:45 -------------------- There are always someone smarter than you... |
|||
|
||||
aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
MetalFan, ты не понял. Ему наоборот надо НЕ блокировать GUI, но ждать результата функции.
Я бы тоже не выносил в отдельный поток. Просто в выполняемой функции, занимающей долгое время, добавил ProcessMessages... -------------------- ![]() |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
aktuba, это ты не понял. НЕКУДА ему добавлять ProcessMesages при выполнении функции в главном потоке)
-------------------- There are always someone smarter than you... |
|||
|
||||
CatATonik |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 12.1.2007 Где: Москва Репутация: 6 Всего: 8 |
Вот так, и процессор не грузится, только обязательно в конце нужно послать приложению какое либо сообщение (не обязательно WM_ACTIVATEAPP):
|
|||
|
||||
Caduser |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 2.10.2006 Где: г. Хабаровск Репутация: 1 Всего: 1 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |