首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

痛苦,多线程创建不出来,总是出错,高手是不是在忙

2012-03-23 
痛苦,多线程创建不出来,总是出错,高手是不是在忙?在线等线程的创建如下:unit th1pasinterfaceusesClasses

痛苦,多线程创建不出来,总是出错,高手是不是在忙?在线等
线程的创建如下:
unit th1pas;
interface
uses
  Classes{$IFDEF MSWINDOWS}, Windows{$ENDIF}, RealDataControl, main;
type
  TH1 = class(TThread)
  private
  procedure SetName;
  protected
  procedure Execute; override;
  public
  constructor create;
  end;

implementation

constructor th1.create;
begin
  inherited Create(false);
  FreeOnterminate := true;
end;



{$IFDEF MSWINDOWS}
type
  TThreadNameInfo = record
  FType: LongWord; // must be 0x1000
  FName: PChar; // pointer to name (in user address space)
  FThreadID: LongWord; // thread ID (-1 indicates caller thread)
  FFlags: LongWord; // reserved for future use, must be zero
  end;
{$ENDIF}

{ TH1 }

procedure TH1.SetName;
{$IFDEF MSWINDOWS}
var
  ThreadNameInfo: TThreadNameInfo;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
  ThreadNameInfo.FType := $1000;
  ThreadNameInfo.FName := 'Thread1';
  ThreadNameInfo.FThreadID := $FFFFFFFF;
  ThreadNameInfo.FFlags := 0;

  try
  RaiseException($406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo);
  except
  end;
{$ENDIF}
end;

procedure TH1.Execute;
begin
  SetName;
  { Place thread code here }
  // inc(handmode);
  // SendMessage(Form1.Handle, WM_MyMsg, 0, 0);
end;
end.


调用:

var b:th1;

procedure TForm1.BitBtn7Click(Sender: TObject);
begin
b:=th1.Create ;
end;

procedure TForm1.BitBtn8Click(Sender: TObject);
begin
if not b.Suspended then b.Suspend;
end;

procedure TForm1.BitBtn9Click(Sender: TObject);
begin
if b.Suspended then b.Resume;
end;

====
有没有 constructor都有错, 在点击按钮8或按钮9时
thread error 错误(6) 或者 thread error(5);
明显是create不成功.

[解决办法]
很明显的错误,你的进程虽然已创建,但并未激活,所以出错了。
正确:
constructor th1.create; 
begin 
inherited Create(true); 
FreeOnterminate := true; 
end; 

[解决办法]
1、FreeOnterminate属性表示线程停止后是否释放线程对象,而线程是否执行完毕则是看Execute;调用是否完成,明显没有循环调用一次后就被释放了
之后点击按钮8或按钮9时b变量已经是无效的资源了
constructor th1.create; 
begin 
inherited Create(False); 
FreeOnterminate := True;
end; 

2、Execute-SetName-RaiseException()顺利地产生一个异常!

楼主还是搜索“TThread”看看别人的例子先

热点排行