Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание потока 
:(
    Опции темы
Михалыч
Дата 29.7.2010, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 472
Регистрация: 1.7.2008

Репутация: нет
Всего: нет



Создал поток,нужно что бы во время открытия текстового файла одновременно загружался текст и  работал ProgressBar ,
но пока текст не загрузится, ProgressBar стоит 



Код

  TNewThread = class(TThread)
    private
      Progress: integer;
  protected
    procedure Execute; override;
    procedure SetProgress;


  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TNewThread }

procedure TNewThread.Execute;
var
  i: integer;
begin
  for i:=0 to 100 do
  begin
    sleep(50);
    Progress:=i;
    Synchronize(SetProgress);
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  NewThread: TNewThread;
begin
  NewThread:=TNewThread.Create(true);
  NewThread.FreeOnTerminate:=true;
  NewThread.Priority:=tpLower;
  NewThread.Resume;
      if form1.OpenDialog1.Execute   then
  Form1.RichEdit1.Lines.LoadFromFile(form1.OpenDialog1.FileName);
end;


procedure TNewThread.SetProgress;
begin
  Form1.ProgressBar1.Position:=Progress;

end;




--------------------
За частый поиск был забанен во всех известных поисковых системах.
Обиженных  комодераторов: 1 
PM MAIL   Вверх
Dom
Дата 29.7.2010, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 7.8.2005

Репутация: 1
Всего: 4



А когда загрузится показывает сразу 100%?

Ведь что получается. Создали новый поток, запустили. Основному потоку сказано открыть файл, и он занят именно открытием файла. Собственно поэтому обращения к форме из SetProgress и не обрабатываются, а стоят в очереди, как я понимаю. Тут надо либо добавить в SetProgress вызов Application.ProcessMessages, либо (что выглядит логичнее) вынести в поток именно саму загрузку файла (например в потоке грузить данные в отдельный СтрингЛист или еще какой подходящий не VCL контейнер, а потом в конце заливать загруженные данные в РичЭдит).
Но все равно такая конструкция как есть не понятна. Такой прогресс бар фактически отражает не индикацию загрузки, а только предопределенные интервалы времени. Т.е. если файл будет грузиться дольше 5 сек, то прогресс бар уже заполнится, а файл еще будет грузиться. И наоборот.
PM MAIL   Вверх
Михалыч
Дата 29.7.2010, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 472
Регистрация: 1.7.2008

Репутация: нет
Всего: нет



Цитата(Dom @  29.7.2010,  17:23 Найти цитируемый пост)
Но все равно такая конструкция как есть не понятна. Такой прогресс бар фактически отражает не индикацию загрузки, а только предопределенные интервалы времени. Т.е. если файл будет грузиться дольше 5 сек, то прогресс бар уже заполнится, а файл еще будет грузиться. И наоборот. 

В этом примере я хотел показать то,что именно когда загружается текст в Richedit ,то все остальное не работает,и не знаю как сделать поток что бы именно в главном загружался текст ,а в созданном работал Progress. А то что Progress так отображается , то это не столь важно


--------------------
За частый поиск был забанен во всех известных поисковых системах.
Обиженных  комодераторов: 1 
PM MAIL   Вверх
Dom
Дата 29.7.2010, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 7.8.2005

Репутация: 1
Всего: 4



Так что, Application.ProcessMessages помог? Если нет, тогда можно вызвать перед ним еще и рефреш формы. Это самый простой вариант как по мне.
PM MAIL   Вверх
Михалыч
Дата 29.7.2010, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 472
Регистрация: 1.7.2008

Репутация: нет
Всего: нет



Application.ProcessMessages не помог,так же,пока идет загрузка текста Progress молчит


--------------------
За частый поиск был забанен во всех известных поисковых системах.
Обиженных  комодераторов: 1 
PM MAIL   Вверх
Dom
Дата 29.7.2010, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 7.8.2005

Репутация: 1
Всего: 4



И принудительный рефреш формы тоже не помог? Странно. Т.е. получается, что при открытии файла основной поток замораживается что ли, раз не воспринимает другие сообщения. А если поставить бряк на Form1.ProgressBar1.Position:=Progress; он срабатывает?
Можно еще поставить приоритет потока с прогресс баром на нормальный уровень, как и у основного потока.


PM MAIL   Вверх
Михалыч
Дата 29.7.2010, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 472
Регистрация: 1.7.2008

Репутация: нет
Всего: нет



Цитата(Dom @  29.7.2010,  20:12 Найти цитируемый пост)
Можно еще поставить приоритет потока с прогресс баром на нормальный уровень, как и у основного потока.

Я его синхронизировал с главным потоком, и ставил на критический,и на высокий, все одно и тоже

Добавлено через 1 минуту и 10 секунд
Че то мне кажется,что я не так поток сделал,где то ошибка smile 


--------------------
За частый поиск был забанен во всех известных поисковых системах.
Обиженных  комодераторов: 1 
PM MAIL   Вверх
Dom
Дата 29.7.2010, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 7.8.2005

Репутация: 1
Всего: 4



Понял кажется. Главный поток таки замораживается пока грузится файл. Т.е. он не обрабатывает очередь сообщений, соответственно дочерний поток ждет когда отработает его код Form1.ProgressBar1.Position:=Progress, который выполняется в контексте главного потока, который в этот момент занят.
Все что я советовал выше глупости и работать не будет. smile
Как побороть? Не знаю, скорее всего никак, т.к. процедура LoadFromFile стандартная и в ней не предусмотрена обработка очереди сообщений.
PM MAIL   Вверх
Демо
Дата 30.7.2010, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Показывай просто бегунок, как Майкрософт делает, и всё.

Не создавай TRicheidt изначально на форме, а создай в доп. потоке невидимым, и загружай файл в него в потоке.
После загрузки отображай на форме.


--------------------
    
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0818 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.