谢了.
解决方案 »
- TButton无法显示png图像
- 请问怎么读取系统安装日期呢?
- 我想把鼠标的操作记录写到主窗体中,遇到难题
- delphi 如何分割用全角字符分隔(中文的顿号)的字符串
- TreeView1展开一个节点,其它展开的节点闭合?
- OLE打开Word文档的怪问题
- 我想用光标VK_UP实现光标向上一个控件移动,怎么做?就好象TAB按钮使光标移向下一个控件一样?
- delphi如何调用c++里参数为char*的dll
- 这个问题以前也问了,还是没办法--------为什么我连不上服务哭呢?
- 如问如果在delphi中进行SOL的后台查询
- TForm的OnClose事件和OnDestroy事件有何区别?
- 如何使用一个按钮将Memo控件中的内容实现字体加粗,斜体,加下划线?
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, ExtCtrls, Pg2;const
WM_ThreadDoneMsg = WM_User + 8;type
TForm1 = class(TForm)
ProgressBar1: TProgressBar;
ProgressBar2: TProgressBar;
Button1: TButton;
Button2: TButton;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
Bevel1: TBevel;
Bevel2: TBevel;
Label1: TLabel;
Label2: TLabel;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure TrackBar2Change(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
MyThread1 : TMyThread; // thread number 1
MyThread2 : TMyThread; // thread number 2
Thread1Active : boolean; // used to test if thread 1 is active
Thread2Active : boolean; // used to test if thread 2 is active
procedure ThreadDone(var AMessage : TMessage); message WM_ThreadDoneMsg; // Message to be sent back from thread when its done
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject); // Create Thread 1
{ The thread will destroy iteself when it is done executing because FreeOnTerminate is set to true.
The first paramter is the priority, and the second is the progressbar to update.
}
begin
if (MyThread1 = nil) or (Thread1Active = false) then // make sure its not already running
begin
MyThread1 := TMyThread.CreateIt(TrackBar1.Position, ProgressBar1);
Thread1Active := true;
end
else
ShowMessage('Thread still executing');
end;procedure TForm1.Button2Click(Sender: TObject); // Create Thread 2
begin
if (MyThread2 = nil) or (Thread2Active = false) then // make sure its not already running
begin
MyThread2 := TMyThread.CreateIt(TrackBar2.Position, ProgressBar2);
Thread2Active := true;
end
else
ShowMessage('Thread still executing');
end;procedure TForm1.Button3Click(Sender: TObject); // Terminate Thread 1
begin
if (MyThread1 <> nil) and (Thread1Active = true) then // check to see if it is running
MyThread1.Terminate
else
ShowMessage('Thread not started');
end;procedure TForm1.Button4Click(Sender: TObject); // Terminate Thread 2
begin
if (MyThread2 <> nil) and (Thread2Active = true) then // check to see if it is running
MyThread2.Terminate
else
ShowMessage('Thread not started');
end;procedure TForm1.ThreadDone(var AMessage: TMessage); // keep track of when and which thread is done executing
begin
if ((MyThread1 <> nil) and (MyThread1.ThreadID = cardinal(AMessage.WParam))) then
begin
Thread1Active := false;
end;
if ((MyThread2 <> nil) and (MyThread2.ThreadID = cardinal(AMessage.WParam))) then
begin
Thread2Active := false;
end;
end;
procedure TForm1.FormCreate(Sender: TObject); // initialize to zero
begin
Thread1Active := false;
Thread2Active := false;
end;
procedure TForm1.TrackBar1Change(Sender: TObject); // set Thread 1 Priority
begin
if (MyThread1 <> nil) and (Thread1Active = true) then
MyThread1.priority := TThreadPriority(TrackBar1.Position);
end;procedure TForm1.TrackBar2Change(Sender: TObject); // set Thread 2 Priority
begin
if (MyThread2 <> nil) and (Thread2Active = true) then
MyThread2.priority := TThreadPriority(TrackBar2.Position);
end;
procedure TForm1.FormDestroy(Sender: TObject); // Terminate any threads still running
begin
if (MyThread1 <> nil) and (Thread1Active = true) then
begin
MyThread1.Terminate;
MyThread1.WaitFor; // wait for it to terminate
end;
if (MyThread2 <> nil) and (Thread2Active = true) then
begin
MyThread2.Terminate;
MyThread2.WaitFor;
end;
end;end.
unit Pg2;interfaceuses
Classes, comctrls;type
TMyThread = class(TThread)
private
PB : TProgressBar; // Reference to ProgressBar
procedure InitProgressBar; // Setup ProgressBar
procedure UpdateProgressBar; // Update ProgressBar
protected
procedure Execute; override; // Main thread execution
published
constructor CreateIt(PriorityLevel: cardinal; ProgBar : TProgressBar);
destructor Destroy; override;
end;implementationuses
windows, Pg1;constructor TMyThread.CreateIt(PriorityLevel: cardinal; ProgBar : TProgressBar);
begin
inherited Create(true); // Create thread suspended
Priority := TThreadPriority(PriorityLevel); // Set Priority Level
FreeOnTerminate := true; // Thread Free Itself when terminated
PB := ProgBar; // Set reference
Synchronize(InitProgressBar); // Setup the ProgressBar
Suspended := false; // Continue the thread
end;destructor TMyThread.Destroy;
begin
PostMessage(form1.Handle,wm_ThreadDoneMsg,self.ThreadID,0);
{
This posts a message to the main form, tells us when and which thread
is done executing.
}
inherited destroy;
end;
procedure TMyThread.Execute; // Main execution for thread
var
i : cardinal;
begin
i := 1;
while ((Terminated = false) and (i < 100000)) do
begin
Synchronize(UpdateProgressBar); // Update ProgressBar, uses sychronize because ProgressBar is in another thread
Inc(i);
// if Terminated is true, this loop exits prematurely so the thread will terminate
end;
end;procedure TMyThread.InitProgressBar; // setup/initialize the ProgressBar
begin
PB.Min := 1; // minimum value for bar
PB.Max := 100000; // maximum value for bar
PB.Step := 1; // size will be used by each call to StepIt
PB.Position := 1; // set position to begining
end;
procedure TMyThread.UpdateProgressBar; // Updates the ProgressBar
begin
PB.StepIt; // step the bar
end;
end.
delphi的这个例了为什么运行不了.