Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Градиентный прогрес в отдельном потоке   Найти похожие ветки 

 
mambo ©   (2009-11-18 12:21) [0]

Нужна помощь знающих потоки. Хочу сделать градиентный прогресс бар написал код. Так как ресурсы машины уходят на его работу переписал с созданием отдельного потока, но прогрес перестал прорисовыватся.
Помогите, где моя ошибка.
Класс прогреса:
unit MyVisualClasess;

interface

uses
 Classes, SysUtils, StdCtrls, ExtCtrls, RzPanel,Forms, Controls,
 Windows;

type
 TMyUnlimProgress = class(TThread)
 private
   FImage : TImage;
   FProgrPan : TPanel;
   FCaption : TCaption;
   FLabel      : TLabel;
   FStop       : boolean; // Признак остановки
   FWay  : Boolean; // направление движения, true - вправо
   FLengthProgr  : Integer; // Счетчик длины градиента
   FSleep : Integer;         // Скорость градиента (задержка)
   FWidthPrgLine :integer;// Довжина градієнту

   procedure CreateComponent (aOwner: TComponent; aWinControl: TWinControl);
 protected
   procedure Execute; override;
   procedure ThreadStop;
 public
   constructor Create(aOwner: TComponent; aWinControl: TWinControl);
 end;

implementation

{ TMyUnlimProgress }

constructor TMyUnlimProgress.Create(aOwner: TComponent; aWinControl: TWinControl);
begin
inherited Create(true);     //Созданный поток создается в приостановленном состоянии
 FreeOnTerminate := True;    //Поток освободит ресурсы при окончании работы
 Self.Priority := tpHighest; //Очень высокий приоритет
 CreateComponent (aOwner,aWinControl);
 Resume;
end;

procedure TMyUnlimProgress.CreateComponent(aOwner: TComponent;
 aWinControl: TWinControl);
begin
 FCaption:= " Мой прогресс... ";
 FProgrPan:= TPanel.Create(AOwner);
 with FProgrPan do begin
   Top:= (aWinControl.Height div 2)- 50;
   Height:= 30;
   Left:= (aWinControl.Width div 2)- 125;
   Width:= 250;
   Parent:= aWinControl;
   Visible:= true;
 end;
 FLabel:= TLabel.Create(aOwner);
 with FLabel do begin
   Align:= alTop;
   Caption:= FCaption;
   Parent:= FProgrPan;
 end;
 FImage:= TImage.Create(AOwner);
 with FImage do begin
   Align:= alClient;
   Parent:= FProgrPan;
 end;
 FLengthProgr:= 0;
 FSleep:= 30;
 FWidthPrgLine:= 100;
 Fstop:= false;
 FWay:= true;
end;

procedure TMyUnlimProgress.Execute;
var
 HandleChange: THandle;  //Handle создаваемого объекта для ожидания события
 i,j,n : Longint;
 v_stmove  : Boolean;
begin
 try
//-- Цикл, пока для потока не будет выдана команда Terminate
   while not Terminated do
   begin
     if FWay then begin
       v_stmove:= false;
      i:= 1; j:=1;
       while (i < FImage.Width+FWidthPrgLine+1) or (not Terminated) do begin
         if FLengthProgr <= FWidthPrgLine then begin
          Inc(FLengthProgr);
         end
          else begin
            v_stmove:= true;
            FLengthProgr:= 0;
          end;
         while (j < FImage.Height - 1) or (not Terminated) do begin
           if v_stmove then
             FImage.Canvas.Pixels[i-FWidthPrgLine-1,j]:= $FFFFFF;
           for n := FWidthPrgLine downto 1 do begin
             FImage.Canvas.Pixels[i-n,j] := RGB((255*n div FWidthPrgLine),(255*n div FWidthPrgLine),255);
           end;
           inc(j);
         end;
         sleep(FSleep);
         inc(i);
       end;
       FWay:= false;
     end;
// move from right to left
      {else begin
        v_stmove:= true;
        FLengthProgr:= 0;
        i:= FImage.Width;
        while i > -(FWidthPrgLine+1) do begin
          if FLengthProgr <= FWidthPrgLine then begin
            Inc(FLengthProgr);
          end
           else begin
             v_stmove:= true;
             FLengthProgr:= 0;
           end;
          for j:=1 to FImage.Height - 1 do begin
            if v_stmove then begin
              FImage.Canvas.Pixels[i+FWidthPrgLine+1,j]:= $FFFFFF;
            end;
            for n := 1 to FWidthPrgLine do begin
              FImage.Canvas.Pixels[i+n,j] := RGB((255*n div FWidthPrgLine),(255*n div FWidthPrgLine),255);//a[n];
            end;
          end;
          sleep(FSleep);
          dec(i);
        end;
        FWay:= true;
      end; }
// end move from right to left
   end;
 finally
 end;
 Synchronize(ThreadStop);
end;

procedure TMyUnlimProgress.ThreadStop;
begin
FImage.Free;
FLabel.Free;
FProgrPan.Free;
end;

end.

Вызов из главной формы:
form1.Tag := Integer(TMyUnlimProgress.Create(self,form1));
остановка потока
 if Assigned(TMyUnlimProgress(form1.Tag)) then
   TMyUnlimProgress(form1.Tag).Terminate;
 form1.Tag := 0;


 
brother ©   (2009-11-18 12:26) [1]

> Так как ресурсы машины уходят на его работу переписал с
> созданием отдельного потока, но прогрес перестал прорисовыватся.

чего куда уходит?) зачем отдельный поток?


 
mambo ©   (2009-11-18 13:06) [2]

Если точнее сказать, то просто выполнение программы уходит в ветку работы прогреса и соответственно пока он не остановится ничего далее работать не будет


 
clickmaker ©   (2009-11-18 13:11) [3]

> Так как ресурсы машины уходят на его работу

когда ресурсы уходят на "шашечки", а не на "ехать" - это не есть гут.
проще всего в рабочий цикл вставить Application.ProcessMessages, и все делать в основном потоке, либо вынести работу в отдельный поток и обновлять прогресс посылкой сообщения


 
mambo ©   (2009-11-18 13:25) [4]


> проще всего в рабочий цикл вставить Application.ProcessMessages,
>  и все делать в основном потоке, либо вынести работу в отдельный
> поток и обновлять прогресс посылкой сообщения


С Application.ProcessMessages не проходит уже пробовал :-(. Поэтому то и пробую сделать в отдельном потоке.


 
brother ©   (2009-11-18 13:26) [5]

а что не работает?


 
mambo ©   (2009-11-18 15:15) [6]

в данном варианте не происходит прорисовка FImage.Canvas. Цикл работает


 
clickmaker ©   (2009-11-18 15:48) [7]

> не происходит прорисовка FImage.Canvas

ну так надо FImage.Update сказать или Refresh


 
Егорка   (2009-11-18 17:39) [8]

Удалено модератором
Примечание: Offtopic



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.146 c
2-1338991657
начинающий41
2012-06-06 18:07
2013.03.22
Sender: TObject


2-1335777792
Vladolin7
2012-04-30 13:23
2013.03.22
Как ввести данные в поле Memo?


15-1330633805
Юрий
2012-03-02 00:30
2013.03.22
С днем рождения ! 2 марта 2012 пятница


15-1352816598
mfender
2012-11-13 18:23
2013.03.22
Fatal error. Не создаётся .dcu


1-1299182243
Дмитрий Белькевич
2011-03-03 22:57
2013.03.22
URL-кодировка (URL encoding, Percent-encoding)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский