Потоки в Lazarus'е

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Потоки в Lazarus'е

Сообщение bestonix » 04.04.2011 14:55:54

Доброго здоровья уважаемые коллеги.

Озаботился изучением потоков. Попытался написать небольшую программу которая бы реализовала мне работу потока.
В поток вынес процедуру, которая по таймеру в статусбаре рисует некое движение.
Но. Во первых совершенно не видно никакого движения, во вторых программа впадает в коматозное состояние.
Подскажите пожалуйста, что и где не так сделано.

К сожалению не прицепляется файл, поэтому прошу простить, что вписал его прямо здесь

Код: Выделить всё
procedure TFMain.Timer1Timer(Sender: TObject);
begin
  label9.Caption := IntToStr(StrToInt(label9.Caption) - 1);
end;

procedure TMyThread.Execute;
begin
  Synchronize(@FMain.RepExecuter);
end;

constructor TMyThread.Create(CreateSuspended: boolean);
begin
  FreeOnTerminate := true;
  inherited Create(CreateSuspended);
end;

procedure TFMain.FormCreate(Sender: TObject);
var d,m,y  : word;
    i      : integer;
begin
  DecodeDate(Date, y,m,d);
  cbMonth.ItemIndex      := m;
  MainTimer.Interval      := setTimer.Value * 1000;
  label9.Caption             :='...';
  SGListFiles.Cells[0, 0] := UTF8ToSys('Наименование файла');
  SGListFiles.Cells[1, 0] := UTF8ToSys('Размер');
end;

procedure TFMain.mainTimerTimer(Sender: TObject);
begin
  mainTimer.Enabled := false;
  Timer1.Enabled    := false;

  //создание отдельного потока для выполнения процедуры обработки
  MyThread := TMyThread.Create(false);
  if Assigned(MyThread.FatalException) then raise MyThread.FatalException;
  MyThread.Resume;

  //RepExecuter;

  label9.Caption    := IntToStr(setTimer.Value);
  mainTimer.Enabled := true;
  Timer1.Enabled    := true;
end;

procedure TFMain.CheckBox2Change(Sender: TObject);
begin
  cbMonth.Enabled := CheckBox2.Checked;
end;

procedure TFMain.chTimerChange(Sender: TObject);
begin
  setTimer.Enabled := not chTimer.Checked;
  if chTimer.Checked then begin
     MainTimer.Interval := setTimer.Value * 1000;
     label9.Caption     := IntToStr(setTimer.Value);
  end else begin
     MainTimer.Interval := 0;
     label9.Caption     := '...';
  end;
  MainTimer.Enabled := chTimer.Checked;
  Timer1.Enabled    := chTimer.Checked;
end;

procedure TFMain.RepExecuter;
begin
      //ShowMessage('Work procedure RepExecuter');
      while (true) do begin
         Sbar.Panels[0].Text:='  \';
         Sbar.Panels[0].Text:='  |';
         Sbar.Panels[0].Text:='  /';
         Sbar.Panels[0].Text:='  -';
      end;
end;



Заранее благодарю за помощь.
bestonix
новенький
 
Сообщения: 66
Зарегистрирован: 15.04.2010 08:26:00
Откуда: Жигулёвск

Re: Потоки в Lazarus'е

Сообщение Bupyc » 04.04.2011 16:20:34

Если Вы из потока запускаете через Synchronize процедуру, которая никогда не заканчивается, то вообще зачем для этого нужен поток? Может проще по таймеру менять состояние Sbar.Panels[0].Text ?

Если я чего то не понимаю, и это действительно то, что Вы хотели сделать, то добавьте Application.ProcessMessages вот в этот цикл

Код: Выделить всё

procedure TFMain.RepExecuter;
begin
      //ShowMessage('Work procedure RepExecuter');
      while (true) do begin
         Sbar.Panels[0].Text:='  \';
         Sbar.Panels[0].Text:='  |';
         Sbar.Panels[0].Text:='  /';
         Sbar.Panels[0].Text:='  -';

        Application.ProcessMessages();
      end;
end;


После этого программа висеть не будет.

P.S. Я бы еще между установками Sbar.Panels[0].Text какой-нибудь Sleep что ли воткнул, а то очень быстро вертеться будет.
P.P.S Не обижайтесь, вообще какой-то мутный код :)
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

Re: Потоки в Lazarus'е

Сообщение bestonix » 04.04.2011 16:55:12

Ни капли не обижаюсь. Изначально задумано, что в этой процедуре будет отрабатываться код по разархивированию файлов, проверке их на годность для обработки другой программой и наконец копирование этих файлов той самой другой программе для обработки.

Просто выкинул для краткости из нее код и написал "крутилку".
Прописал Application.ProcessMessages(); Из комы программа вышла, уже здорово.

Так так, кажись заработало.

Большое спасибо.
bestonix
новенький
 
Сообщения: 66
Зарегистрирован: 15.04.2010 08:26:00
Откуда: Жигулёвск

Re: Потоки в Lazarus'е

Сообщение daesher » 05.04.2011 21:26:57

Я бы поступил проще: в зону синхронизации бы выбросил функцию, исключительно отображающую поворот "палочки". По мере необходимости (скажем, на отдельных стадиях процесса) я бы вызывал именно её.
daesher
постоялец
 
Сообщения: 221
Зарегистрирован: 09.03.2010 22:17:14


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 41

Рейтинг@Mail.ru