怎样能跟踪线程(100分)

  • 主题发起人 主题发起人 zhengli
  • 开始时间 开始时间
Z

zhengli

Unregistered / Unconfirmed
GUEST, unregistred user!
如果编写了一个线程类,比如说TMyThread,
在MyThread := TMyThread.Create,之后,
我怎样才能知道我的线程是否执行了,
即我怎样才能跟踪到线程内部.
 
在Execute里开始和结束各发一个消息给主线程
 
我在Execute里加一个断点,
如果线程执行了的话,是不是会停止于断点处.
 
没试过,我喜欢不让程序中断来判断是否执行
 
zhengli: 会的, 我试过. 但是会有些隐患的. 比如你的线程和别的线程公用一个
全局的变量或文件, 那么冲突的情况很可能查不出来(因为人为地造成了一个延时).
在线程中要对全局系统资源进行 争用挑战/锁定 机制的, 用mutex.
 
同意IKnow,我现在正在写多线程程序,遇到一大堆资源访问冲突的问题,因为这样
的话主线程非常快,而辅助线程慢所以最好用同步或互撤的方法解决此问题
 
多人接受答案了。
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;


type
TForm1 = class(TForm)
Edit1: TEdit;

Edit2: TEdit;

Button1: TButton;

procedure Button1Click(Sender: TObject);

procedure FormClose(Sender: TObject;
var Action: TCloseAction);

private
{ Private declarations }
public
{ Public declarations }
end;

TMyThread = class(TThread)
private
Number1Edit, Number2Edit: TEdit;

Number1, Number2: Integer;

Procedure ShowNumber;

protected
procedure Execute;
override;

public
Constructor Create(Edit1, Edit2: TEdit);

end;


var
Form1: TForm1;


implementation


{$R *.DFM}

{ TThread }

constructor TMyThread.Create(Edit1, Edit2: TEdit);

begin

Number1Edit := Edit1;

Number2Edit := Edit2;

Number1 := 0;

Number2 := 0;

// inherited Create(False);

Resume;

end;


procedure TMyThread.Execute;

begin

inherited;

Form1.Canvas.TextOut(100, 100, 'Why');

ShowNumber;

end;


procedure TMyThread.ShowNumber;

var
i: Integer;

begin

For i := 1 to 100000do

begin

Number1Edit.Text := IntToStr(Number1);

Number2Edit.Text := IntToStr(Number2);

Form1.Edit1.Text := IntToStr(Number1);

Form1.Edit2.Text := IntToStr(Number2);

Inc(Number1);

Inc(Number2);

Form1.Canvas.TextOut(10, 10, IntToStr(Number1 + Number2));

end;

end;


procedure TForm1.Button1Click(Sender: TObject);

begin

TMyThread.Create(Edit1, Edit2);

end;


end.


这个程序不能正常运行,总是执行不到
Execute,不知为什么,请各位帮忙查查错。
 

> constructor TMyThread.Create(Edit1, Edit2: TEdit);

> begin

inherited Create(False);

> Number1Edit := Edit1;

> Number2Edit := Edit2;

> Number1 := 0;

> Number2 := 0;

> // inherited Create(False);

> Resume;

> end;

> procedure TMyThread.Execute;

> begin

// inherited;

> Form1.Canvas.TextOut(100, 100, 'Why');

> ShowNumber;

> end;
 
你可以在线程定义中再增加一函数,增加一个FormOfTForm1
procedure output;
begin
FormOfTForm1.Canvas.TextOut(100, 100, 'Why');

end;

而后在Execute中Synchronize(output)即可。
 
后退
顶部