![]() |
|
|
#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
|
|||
|
|||
![]() Цитата:
Ну только чуть подробнее. В главной форме делаешь метод типа: Код:
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; Ну там инициализацию, собственно назначение метода из формы и т.д. допишешь самостоятельно. Идея примерно такая. Можно сделать более красиво, но это будет сложнее. |
#6
|
|||
|
|||
![]() Помогите, пишу программу для чтения/записи регистров ввода-вывода, и когда пытаюсьв цикле, то записать ноль, то единицу в бит порта, она виснет и все..почитала в интернете, что для того чтобы не было такого надо создавать потоки. Какие потоки создать, чтобы при нажатии на кнопку процесс чтения/записи закончился???
|
#7
|
||||
|
||||
![]() Ну есс-но будет виснуть, если вычитывание в блокирующем режиме работает.
Как создать поток: CreateThread(/*смотрим в MSDN сами*/); — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |