![]() |
|
|
#1
|
|||
|
|||
|
Здравствуйте! Подскажите пожалуйста как к выполнению потока прикрутить ProgressBar .
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Pogoda, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdHTTP, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
IdHTTP1: TIdHTTP;
ProgressBar1: TProgressBar;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure UpdateCaption;
end;
var
Form1: TForm1;
MyThread: TMyThread;
implementation
{$R *.dfm}
procedure TMyThread.UpdateCaption;
begin
Form1.Caption:='Ïîòîê çàâåðø¸í';
end;
procedure TMyThread.Execute;
begin
pogoda1;
Synchronize(UpdateCaption);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
MyThread:=TMyThread.Create(False);
MyThread.Priority:=tpNormal;
MyThread.FreeOnTerminate:=true;
end;
end.мне нужно чтоб прогресс бар показывал результат выполнения Код:
procedure TMyThread.Execute; begin pogoda1; Synchronize(UpdateCaption); end; Последний раз редактировалось Gudzik11, 29.06.2012 в 22:29. |
|
#2
|
|||
|
|||
|
Делай CallBack.
В поток передаешь указетель на некоторый метод формы, который будет вызван при каждом шаге с новым значением счетчика. |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Gudzik11 (30.06.2012)
| ||
|
#3
|
|||
|
|||
|
Можно по подробней ?
|
|
#4
|
|||
|
|||
|
В UpdateCaption делай изменение ProgressBar`a.
|
|
#5
|
|||
|
|||
|
Помогите, пишу программу для чтения/записи регистров ввода-вывода, и когда пытаюсьв цикле, то записать ноль, то единицу в бит порта, она виснет и все..почитала в интернете, что для того чтобы не было такого надо создавать потоки. Какие потоки создать, чтобы при нажатии на кнопку процесс чтения/записи закончился???
|
|
#6
|
||||
|
||||
|
Ну есс-но будет виснуть, если вычитывание в блокирующем режиме работает.
Как создать поток: CreateThread(/*смотрим в MSDN сами*/); |
|
#7
|
|||
|
|||
|
Цитата:
Ну только чуть подробнее. В главной форме делаешь метод типа: Код:
TForm1 = class(TForm) ... procedure ShowProgress(APos, AMax : Integer); ... procedure TForm1.ShowProgress(APos, AMax : Integer); begin ProgressBar1.MaxValue := AMax; ProgressBar1.Position := APos; end; Теперь в модуле с потоком надо сделать вызов такой процедуры: Код:
TProgressEvent = procedure (APos, AMax : Integer) Of Object; TThread1 = class(TThread) private FPos, FMax : Integer; FOnProgress : TProgressEvent; procedure CallOnProgress; // нужно для вызова через Synchronize property OnProgress : TProgressEvent read FOnProgress wride FOnProgress; ... procedure TThread1.CallOnProgress; begin If Assigned(FOnProgress) Then FOnProgress(FPos,FMax); end; procedure TThread1.Execute; begin // Пример начального вызова FPos := 0; FMax := 0; Synchronize(CallOnProgress); ... end; Ну там инициализацию, собственно назначение метода из формы и т.д. допишешь самостоятельно. Идея примерно такая. Можно сделать более красиво, но это будет сложнее. |