DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: 19137911446
今日帖子: 17
在线用户: 9
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 bjdribllec ★☆☆☆☆ -
盒子活跃会员
2004/3/3 9:54:31
标题:
求教:线程问题,结束程序有残留,需按Restart才能再次调试.why? 浏览:1228
加入我的收藏
楼主: 问题如上,程序如下:(注:运算部分被简化了)
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TMyThread=class(TThread) { 声明线程类 }
     private
        procedure s_ThreadStep;
     protected
        procedure Execute; override;{ 执行线程的方法 }
     public
        constructor Create; virtual; { 线程构造器 }
  end;

var
  Form1: TForm1;
  MyThread:TMyThread;
  mwCount:word;
  mbMode:byte;


implementation

{$R *.dfm}

constructor TMyThread.Create;
begin
   inherited Create(True);
   FreeOnTerminate := False;
end;

procedure TMyThread.s_ThreadStep;
begin
   inc(mwCOunt);
//............
   Form1.Label1.Caption:=IntToStr(mwCount);
end;

procedure TForm1.Button1Click(Sender: TObject);  // 单步
   mbMode:=1;
   if MyThread.Suspended then MyThread.Resume
end;

procedure TForm1.Button2Click(Sender: TObject);  // 连续运行
begin
   mbMode:=2;
   if MyThread.Suspended then MyThread.Resume
end;

procedure TForm1.Button3Click(Sender: TObject); // 转单步后停止
begin
   mbMode:=1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   MyThread:=TMyThread.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   with MyThread do begin
      if not Suspended then Suspend;
      Terminate; { 销毁之前终止线程执行 }
      Destroy;
   end;
end;

procedure TMyThread.Execute;
begin
   repeat
      s_ThreadStep;
      if mbMode=1 then MyThread.Suspend;
   until False;
end;

end.

----------------------------------------------
-
作者:
男 zxdcj (月下舞者) ★☆☆☆☆ -
盒子活跃会员
2004/3/3 10:04:22
1楼: --->constructor TMyThread.Create;
--->begin
--->   inherited Create(True);
--->   FreeOnTerminate := False;
--->end;


里将FreeOnTerminate := False;改为FreeOnTerminate := true;不行吗?

----------------------------------------------
-
作者:
男 bjdribllec ( ) ★☆☆☆☆ -
盒子活跃会员
2004/3/3 10:20:35
2楼: 谢谢月下舞者,不过没感到变化.附测试全程序.
此帖子包含附件:bjdribllec_200433102035.rar 大小:6.0K
----------------------------------------------
-
作者:
男 bios (阿贡) ★☆☆☆☆ -
盒子中级会员
2004/3/3 10:32:31
3楼: http://bbs.2ccc.com/topic.asp?topicid=63846
----------------------------------------------
按此在新窗口浏览图片
按此在新窗口浏览图片
作者:
男 zxdcj (月下舞者) ★☆☆☆☆ -
盒子活跃会员
2004/3/3 10:38:49
4楼: procedure TForm1.FormDestroy(Sender: TObject);
begin
   with MyThread do begin
      if not Suspended then Suspend;
      Terminate; { 销毁之前终止线程执行 }
      Destroy;//*************改成inherited就好了***************
   end;
end;
----------------------------------------------
-
作者:
男 bjdribllec ( ) ★☆☆☆☆ -
盒子活跃会员
2004/3/3 11:01:01
5楼: it's ok now! thanks,zxdcj! thanks, bios!
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行78.125毫秒 RSS