Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2015, 09:22   #1
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию Процедуры в потоках и синхронизация с VCL (Lazarus)

Доброго всем! Что то запутался я... Вообщем выполняю некоторые действия с файлом, на форму в Caption вывожу текущий процент завершенности работы с файлом. Проблема показалась следующим образом: При малых файлах (30-50 кб) процесс происходит моментально... действия в файле выполняются правильно, но в Form.caption сразу 100%. При больших файлах (1,5 Гб и более) процесс видимо не работает... Form.caption висит 0%, структура файла не меняется.
Код:
type
  THandleWorks = (hWorksOne, hWorksTwoo);
{ TWorkThread }  
  TWorkThread = class(TThread)
  private
    Percent: Double;
    procedure SetPercent;
  public
    constructor Create(CreateSuspended: Boolean);
    destructor Destroy; override;
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;
  FilePath: string;
  HandleWorks: THandleWorks;
Код:
{ TForm1 } 
procedure HandleWorksBegin(_FilePath: string; _HandleWorks: THandleWorks; var _Percent: Double);
begin
{тут происходит работа с файлом через THandle, и тут вычисляется процент завершенности - переменная "_Percent"}
end;
Код:
procedure TWorkThread.SetPercent;
begin
  Form1.Caption := 'Working: ' + FloatToStrF(Percent, ffFixed, 3, 2) + '%';
end;

procedure TWorkThread.Execute;
begin
  HandleWorksBegin(FilePath, HandleWorks, Percent);
  Synchronize(SetPercent);
  // Synchronize(@SetPercent);
end;
Понимаю, наверное вопрос должен переехать в раздел "Студентов", но все же... подскажите / покажите как правильно...
kta87 вне форума Ответить с цитированием
Старый 01.03.2015, 10:50   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну видимо HandleWorksBegin не завершен - то ли очень долго работает, то ли вообще зациклился. И не понятен такой способ выдачи прогресса, его обычно в цикле выдают
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.03.2015, 18:49   #3
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

сделай HandleWorksBegin методом треда, высчитывай внутри прогресс и вызывай Synchronize оттуда изнутри цикла при условии, что он изменился на определённую разницу.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 01.03.2015, 19:22   #4
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

min@y™, прыгал, танцевал вокруг да около, а в итоге так и написал... а параметр HandleWorks передаю в Execute потока.
kta87 вне форума Ответить с цитированием
Старый 01.03.2015, 19:26   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Сообщение от kta87 Посмотреть сообщение
min@y™, прыгал, танцевал вокруг да около, а в итоге так и написал... а параметр HandleWorks передаю в Execute потока.
помогло ?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 01.03.2015, 21:09   #6
kta87
Форумчанин
 
Аватар для kta87
 
Регистрация: 22.02.2010
Сообщений: 912
По умолчанию

min@y™, ну это как сказать Вопрос, поставленный в теме решен, кстати я отблагодарил вас. Но после того как переписал по этому алгоритму, решил вообще HandleWorksBegin записать внутри TWorkThread.Execute, а затем и вообще перенес весь код чисто в TWorkThread.Execute, вынося пару переменных в глобальные (т.к. они задаются единожды при работе потока.) По ощущениям работать стало все много медленнее... Сейчас вот пишу 2 версии и счетчики вешаю, для проверки скорости работы.
kta87 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синхронизация потоков и VCL zumm Общие вопросы Delphi 3 14.08.2013 00:46
Прокси в потоках admin22 Общие вопросы Delphi 7 02.01.2013 12:05
Перекомпиляция программы(простой) Win Lazarus в Linux Lazarus Toxifer Фриланс 0 27.11.2012 22:46
Сокеты в потоках unmazable Общие вопросы Delphi 0 12.03.2012 13:35
синхронизация в потоках xrob Общие вопросы Delphi 8 15.11.2010 17:25