注册 登录
编程论坛 Delphi论坛

关于多线程控制的一些问题

gdzhan 发布于 2010-03-01 13:18, 1076 次点击
为什么暂停线程时还是会执行的,不会暂停,,刚开始接触线程,不太懂,
请大家指定一下,

procedure TTestThread.Execute;
begin
  self.FreeOnTerminate := True;
  Synchronize(SetValue);
end;

procedure TTestThread.SetValue;
var
  i: Integer;
begin
  for i := 0 to 100000 do
  begin
    Application.ProcessMessages;
    if self.Terminated then Break;
    form1.Edit1.Text := IntToStr(i);
  end;
end;


//开始线程
procedure TForm1.Button1Click(Sender: TObject);
begin
  MyThread := TTestThread.Create(True);
  mythread.Resume;
end;

//暂停线程
procedure TForm1.Button2Click(Sender: TObject);
begin
  MyThread.Suspend;
end;

//终止线程
procedure TForm1.Button3Click(Sender: TObject);
begin
  MyThread.Terminate;
end;

//继续执行线程
procedure TForm1.Button4Click(Sender: TObject);
begin
  MyThread.Resume;
end;
6 回复
#2
mohao1632010-03-02 09:15
MyThread 你是在哪声明的?  还是MyThread 就是你的thread类。  你声明下MyThread:TMyThread ;然后用个integer记录下handle,对这个线程操作的话应该是可以暂停的
#3
s9123601012010-03-02 21:45
强悍,学习中~~~~
#4
gdzhan2010-03-03 10:44
MyThread是跟主窗体同在一个单元,
///////////////////////////////////
// 线程类
type
  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  public
end;
/////////////////
//窗体类
type
  TForm1 = class(TForm)
  private
    MyThread: TMYThread;
  public
    ........
end;

结构就是上面那样,
#5
mohao1632010-03-03 12:31
只有本站会员才能查看附件,请 登录


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TMyThread = class(TThread)
  protected
    procedure Execute; override;
    procedure SetValue;
  public
end;

type
  TMyThread2 = class(TThread)
  protected
    procedure Execute; override;
  public
end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Edit2: TEdit;
    Edit1: TEdit;
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
  private
    { Private declarations }
     MyThread: TMyThread;
     MyThread2: TMyThread2;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TMyThread.Execute;
begin
  FreeOnTerminate := True;
  Synchronize(SetValue);
end;

procedure TMyThread.SetValue;
var
  i: Integer;
begin
  for i := 0 to 100000 do
  begin
    Application.ProcessMessages;
    if self.Terminated then Break;
    form1.Edit1.Text := IntToStr(i);
  end;
end;

procedure TMyThread2.Execute;
var
  i: Integer;
begin
  FreeOnTerminate := True;
  for i := 0 to 100000 do
  begin
    Application.ProcessMessages;
    if self.Terminated then Break;
    form1.Edit2.Text := IntToStr(i);
  end;
end;


//开始线程
procedure TForm1.Button1Click(Sender: TObject);
begin
  MyThread := TMyThread.Create(false);
end;

//暂停线程
procedure TForm1.Button2Click(Sender: TObject);
begin
  MyThread.Suspend;
end;

//终止线程
procedure TForm1.Button3Click(Sender: TObject);
begin
  MyThread.Terminate;
end;

//继续执行线程
procedure TForm1.Button4Click(Sender: TObject);
begin
  MyThread.Resume;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  MyThread2 := TMyThread2.Create(false);
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
  MyThread2.Suspend;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
  MyThread2.Terminate;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
  MyThread2.Resume;
end;

end.
Synchronize这个是线程同步的方法,其作用是在主线程中执行Synchronize()中的函数;你自己可以体会下
#6
gdzhan2010-03-03 14:11
明白了,,非常感谢mohao163提供的答案,
#7
hhf20102010-11-13 10:43
http://taobao.
http://taobao.

使用本部件后,可以十分方便快速的开发多线程应用程序,无需按常规的繁琐方法建立多线程。建立N多个线程仅需两步!。简单好用才是我们需要的,请大家看使用方法:

1