![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Михалыч |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 472 Регистрация: 1.7.2008 Репутация: нет Всего: нет |
Создал поток,нужно что бы во время открытия текстового файла одновременно загружался текст и работал ProgressBar ,
но пока текст не загрузится, ProgressBar стоит
-------------------- За частый поиск был забанен во всех известных поисковых системах. Обиженных комодераторов: 1 |
|||
|
||||
Dom |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
А когда загрузится показывает сразу 100%?
Ведь что получается. Создали новый поток, запустили. Основному потоку сказано открыть файл, и он занят именно открытием файла. Собственно поэтому обращения к форме из SetProgress и не обрабатываются, а стоят в очереди, как я понимаю. Тут надо либо добавить в SetProgress вызов Application.ProcessMessages, либо (что выглядит логичнее) вынести в поток именно саму загрузку файла (например в потоке грузить данные в отдельный СтрингЛист или еще какой подходящий не VCL контейнер, а потом в конце заливать загруженные данные в РичЭдит). Но все равно такая конструкция как есть не понятна. Такой прогресс бар фактически отражает не индикацию загрузки, а только предопределенные интервалы времени. Т.е. если файл будет грузиться дольше 5 сек, то прогресс бар уже заполнится, а файл еще будет грузиться. И наоборот. |
|||
|
||||
Михалыч |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 472 Регистрация: 1.7.2008 Репутация: нет Всего: нет |
В этом примере я хотел показать то,что именно когда загружается текст в Richedit ,то все остальное не работает,и не знаю как сделать поток что бы именно в главном загружался текст ,а в созданном работал Progress. А то что Progress так отображается , то это не столь важно -------------------- За частый поиск был забанен во всех известных поисковых системах. Обиженных комодераторов: 1 |
|||
|
||||
Dom |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
Так что, Application.ProcessMessages помог? Если нет, тогда можно вызвать перед ним еще и рефреш формы. Это самый простой вариант как по мне.
|
|||
|
||||
Михалыч |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 472 Регистрация: 1.7.2008 Репутация: нет Всего: нет |
Application.ProcessMessages не помог,так же,пока идет загрузка текста Progress молчит
-------------------- За частый поиск был забанен во всех известных поисковых системах. Обиженных комодераторов: 1 |
|||
|
||||
Dom |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
И принудительный рефреш формы тоже не помог? Странно. Т.е. получается, что при открытии файла основной поток замораживается что ли, раз не воспринимает другие сообщения. А если поставить бряк на Form1.ProgressBar1.Position:=Progress; он срабатывает?
Можно еще поставить приоритет потока с прогресс баром на нормальный уровень, как и у основного потока. |
|||
|
||||
Михалыч |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 472 Регистрация: 1.7.2008 Репутация: нет Всего: нет |
Я его синхронизировал с главным потоком, и ставил на критический,и на высокий, все одно и тоже Добавлено через 1 минуту и 10 секунд Че то мне кажется,что я не так поток сделал,где то ошибка ![]() -------------------- За частый поиск был забанен во всех известных поисковых системах. Обиженных комодераторов: 1 |
|||
|
||||
Dom |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 7.8.2005 Репутация: 1 Всего: 4 |
Понял кажется. Главный поток таки замораживается пока грузится файл. Т.е. он не обрабатывает очередь сообщений, соответственно дочерний поток ждет когда отработает его код Form1.ProgressBar1.Position:=Progress, который выполняется в контексте главного потока, который в этот момент занят.
Все что я советовал выше глупости и работать не будет. ![]() Как побороть? Не знаю, скорее всего никак, т.к. процедура LoadFromFile стандартная и в ней не предусмотрена обработка очереди сообщений. |
|||
|
||||
Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 30 Всего: 50 |
Показывай просто бегунок, как Майкрософт делает, и всё.
Не создавай TRicheidt изначально на форме, а создай в доп. потоке невидимым, и загружай файл в него в потоке. После загрузки отображай на форме. -------------------- |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |