![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
Собственно САБЖ. Внутри основной выполняющейся функции Sleep не подойдёт. Пока единственный надуманный вариант это через таймер с самой формы с которой синхронизирую, т.к. первоначальный вариант - синхронизация при изменении данных в потоке, не катит, в следствии из очень частого(быстрого) изменения этих данных, форма "виснет"(таже таймер на ней перестаёт работать), как будто я поток и не создаю....
Всем заранее СПАСИБО! -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
есть ли у кого-нибудь соображения по этому поводу?
Это сообщение отредактировал(а) Albinos_x - 8.1.2006, 02:59 -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Quadr0 |
|
|||
|
Unregistered |
...
Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 09:43 |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Стандартный способ - синхронизация не каждый прохолд цикла, а только через несколько циклов. Например, каждый 10-й, каждый 100-й, 1000-й, и т.д. Таймер в потоке не нужен. Для этого достаточно во время цикла использовать GetTickCount и сравнивать с предыдущим полученным значением. Еще один из вариантов(можетбыть и не самый лучший, но в некоторых случаях может подойти) - это организовать очередь сообщений. В этом случае основная форма может извещать(по таймеру в основном потоке, например) дополнительный поток о том, что нужно обновить данные, используя PostThreadMessage. Это сообщение отредактировал(а) Демо - 8.1.2006, 04:29 -------------------- |
|||
|
||||
| Albinos_x |
|
||||||||||||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
да, правильно. Только у меня там организовано что-то наподобии прогрессбара на форме в котором я показываю процесс выполнения потока - что он делает, и сколько сделал из общего количества...
потому что если я запускаю один поток, то ещё более менее, а вот если два то приложение перестаёт отвечать. Диспетчер задач показывает что оно загрузило на 95% проц. При этом прогресс бар на созданной форме "тикает", но что делает поток не показывает и не показывает сколько времени осталось до завершения работы потока (это у меня реализовано с помощью таймера на форме), перерисовка форм практически не происходит... выглядит ужасно. Вот я писал почему:
это мне не придётся делать, т.к. после отработки потока форма, которую я создаю динамически уничтожается...
это не подойдёт, т.к. я заранее не знаю количество итераций в цикле...
можно поподнобней, что это за зверь? плз... и здесь если можно поподробней.... я то пошлю ему сообщение, а как оно будет обрабатываться? задаю такой вопрос, т.к. если бы я послал сообщение форме, через которую обрабатывал бы так информацию, то оно бы это сообщение обработало после того как отработала основная функция...т.е. приложение бы подвисало этак от 1 до 20 минут...и после этого только бы ловило сообщение... или мне всё таки остановиться на синхронизации из таймера на форме? -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
||||||||||||
|
|||||||||||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Albinos_x
Ты бы чуть подробнее расписал структуру потока, чтобы от чего-то оттолкнуться. Примеры могу привести, но не зная, как организован поток, это может быть пустая работа ;) Добавлено @ 05:03 Я так понимаю, что у тебя в цикле идет расчет неких параметров, которые надо динамически отображать на основной форме? Добавлено @ 05:04 Сейчас приведу пример с GetTickCount. -------------------- |
|||
|
||||
| Albinos_x |
|
||||||||||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
вот:
запуск делаю так:
функция отображения:
код работы потока нет смысла писать, тогда проще весь юнит сюда прикрепить... PS: работа с файлами... Добавлено @ 05:17 да на форме есть ещё таймер который расчитывает оставшееся время:
-------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
||||||||||
|
|||||||||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Вот простой пример:
Добавлено @ 05:45 Для обновления по запросу "извне" возможны несколько вариантов. 1. Используя очередь сообщений - Создаем очередь для выборки сообщений(например, вызвав в Execute PeekMessage) - В цикле в Execute проверяем, есть ли сообщение - опять же PeekMessage с флагом PM_REMOVE), если есть - обновляем форму. - По таймеру из другого потока(например, основного) посылаем сообщение в доп. поток, используя PostThreadMessage 2. Используя объекты синхронизации, например Events, Semaphore - В основном потоке создается объект синхронизации, устанваливается в NonSignaled - В доп. потоке в цикле вызываем функция WaitForSingleObject(<Объект синхронизации>,0) для проверки, требуется ли обновлять форму. - По таймеру из другого потока(например, основного) выставляем объекту синхронизации статус Signaled В принципе, можно еще придумать варианты, но думаю, что для твоей задачи вполне подойдет любое из решений. Добавлено @ 05:47 Кстати, надеюсь, что ShowResult у тебя в методе Synchronize вызывается? -------------------- |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
ясно... значит теперь у меня два варианта...
1. Через таймер 2. и через сообщения... только это мне тогда нужно будет выносить в отдельную процедуру
... наверно всё таки остановлюсь пока на таймере... минимум переделывания.... ВСЕМ ОГРОМНОЕ СПАСИБО!!! -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Albinos_x |
|
||||||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
Прокатит если я сделаю так к примеру:
угу... Добавлено @ 06:26
нет у меня не прокатит -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
||||||
|
|||||||
| Albinos_x |
|
||||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
Демо
сделал по твоему совету...вот так:
вызываю её в циклах, а там где просто нужно обновление вызываю просто:
теперь всё работает как надо... --- теперь возник другой вопрос... но это уже в другой теме... -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
||||
|
|||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |