读书人

关于线程管理解决方法

发布时间: 2012-03-18 13:55:39 作者: rapoo

关于线程管理
主程序的,就写代码了。动态库在加载的时候,传入一个回调函数,动态库在创建新的线程的时候,利用这个回调函数将线程加到线程管理器中。

Delphi(Pascal) code
unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls;type  TForm1 = class(TForm)    Button1: TButton;    Button2: TButton;    Button3: TButton;    Button4: TButton;    Button5: TButton;    Button6: TButton;    procedure Button1Click(Sender: TObject);    procedure FormCreate(Sender: TObject);    procedure FormDestroy(Sender: TObject);    procedure Button4Click(Sender: TObject);    procedure Button3Click(Sender: TObject);    procedure Button2Click(Sender: TObject);    procedure Button5Click(Sender: TObject);    procedure Button6Click(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end;type  TBaseThreadList = class(Tthread)  private    isTerminate : Boolean;  public    constructor create(b : Boolean);    procedure setIsTerminate(b :Boolean);  end;  TestA = class(TBaseThreadList)  private    procedure Execute;  override;  public  end;  Testb = class(TBaseThreadList)  private    procedure Execute;  override;  public  end;var  Form1: TForm1;  m_threadList : TList; //所有线程列表procedure regThread(pThreadList : TBaseThreadList);implementation{$R *.dfm}//注册所有线程  可以作为回调使用procedure regThread(pThreadList : TBaseThreadList);begin  m_threadList.Add(pThreadList);end;procedure TForm1.Button1Click(Sender: TObject);begin  //创建线程  TestA.create(false);  Testb.create(false);end;procedure TForm1.Button2Click(Sender: TObject);begin//启动线程end;procedure TForm1.Button3Click(Sender: TObject);var  i : Integer;begin  //释放线程  //让线程自己主动释放  for i := 0 to m_threadList.Count - 1 do  begin    TBaseThreadList(m_threadList.Items[i]).setIsTerminate(true);  end;end;procedure TForm1.Button4Click(Sender: TObject);var  i ,j: Integer;begin  //显示线程列表所有信息  j := 0;  for i := 0 to m_threadList.Count - 1 do  begin    if not TBaseThreadList(m_threadList.Items[i]).Terminated then      inc(j);  end;  ShowMessage('线程总数:'+inttostr(m_threadList.Count)+'----没有结束的线程个数:'+inttostr(j));end;procedure TForm1.Button5Click(Sender: TObject);var  i : Integer;begin  //强制释放所有线程  for i := 0 to m_threadList.Count - 1 do  begin    TBaseThreadList(m_threadList.Items[i]).Terminate;  end;end;procedure TForm1.Button6Click(Sender: TObject);var  i : Integer;  tpthread : TBaseThreadList;begin  //强制释放所有线程  for i :=  m_threadList.Count - 1 downto 0 do  begin    if not TBaseThreadList(m_threadList.Items[i]).Terminated then      TBaseThreadList(m_threadList.Items[i]).Terminate;    tpthread := TBaseThreadList(m_threadList.Items[i]);    m_threadList.Delete(i);    tpthread := nil;  end;end;procedure TForm1.FormCreate(Sender: TObject);begin    m_threadList := tlist.Create;end;procedure TForm1.FormDestroy(Sender: TObject);begin  m_threadList.Clear;  FreeAndNil(m_threadList);end;{ TparentThreadList }constructor TBaseThreadList.create(b: Boolean);begin  inherited create(b);  regThread(self);end;procedure TBaseThreadList.setIsTerminate(b: Boolean);begin  isTerminate := b;end;{ TestA }procedure TestA.Execute;begin  inherited;  while true do  begin    Sleep(10000);    if self.isTerminate  then Self.Terminate;  end;end;{ Testb }procedure Testb.Execute;begin  while true do  begin    if self.isTerminate  then Self.Terminate;    Sleep(1000);  end;end;end.


[解决办法]
好贴,是给俺送分的吧,嘿嘿

读书人网 >.NET

热点推荐