如何终止一个线程呢???

leiyang 2003-07-14 02:55:58
请教两个关于线程方面的问题:

1:线程中有terminate,可是不是立即终止的。请问用什么办法立即停止一个线程的执行呢?

2:我在Tmythread.execute中,运行从1到1000000的数,我想创建100个线程,每个线程运行10000个,如何实现?

多谢了,分不够再开贴。
...全文
96 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawnming 2003-07-14
  • 打赏
  • 举报
回复
gz
myling 2003-07-14
  • 打赏
  • 举报
回复
i的值?你是说count吧?

可能!

看你的execute是不是一个时钟周期+sleep(100)内能完成的了

一般的操作会满足,但是也有例外

其实你说的那样可以这样

设置一个类内的变量

重载类的构造函数,加上参数,根据参数设置变量

这样,每个线程的变量就互不干扰了 :)
leiyang 2003-07-14
  • 打赏
  • 举报
回复
请问myling(阿德),100个线程同时执行一段代码,i的值不会混乱吧。还是要每一个线程判断一下:thread1:1-10000,thread2:10001-20000....thread100:900001-1000000

小弟初学,还请指教。
duxin 2003-07-14
  • 打赏
  • 举报
回复
吼 吼

写的很全了 抢不过你
myling 2003-07-14
  • 打赏
  • 举报
回复
至于第二个问题,你看看这个,我只是简单的加一,你可以自己改

Unit Unit1;

Interface

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

Type
TForm1 = Class(TForm)
Edit1: TEdit;
Button1: TButton;
ListBox1: TListBox;
Procedure Button1Click(Sender: TObject);
Procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
threadlist: Tlist;
End;
TTestThread = Class(TThread)
private

public
Procedure getcount;
Procedure execute; override;

End;
Var
Form1 : TForm1;
count : integer;
Implementation

{$R *.dfm}

{ TTestThread }

Procedure TTestThread.execute;
Var
i : integer;
Begin
Inherited;
FreeOnTerminate := true;
For i := 1 To 10000 Do
Begin
If Terminated Then
break;
inc(count);
End;
End;

Procedure TTestThread.getcount;
Begin
End;

Procedure TForm1.Button1Click(Sender: TObject);
Var
i : integer;
Begin
Try
For i := 1 To 100 Do
Begin
threadlist.Add(TtestThread.Create(false));
sleep(100);
ListBox1.Items.Add(inttostr(count));
End
Except
showmessage('erro');
End
End;

Procedure TForm1.FormCreate(Sender: TObject);
Begin
threadlist := TList.Create;
End;

End.
myling 2003-07-14
  • 打赏
  • 举报
回复
呵呵,小伍,和我抢分?吼吼!
myling 2003-07-14
  • 打赏
  • 举报
回复
一般情况下,利用将FreeOnTerminate的属性设为True的方法来及时清除线程对象是最方便的办法,这只需要在Excute()退出前设置就行了。
设置方法如下:
Procedure TTestThread.execute;
Var
i : integer;
Begin
Inherited;
FreeOnTerminate:=true;
For i := 1 To 10000000 Do
Begin
if Terminated then break;
inc(count);
Synchronize(getcount);
End;
End;
duxin 2003-07-14
  • 打赏
  • 举报
回复
TerminateThread 可以立即结束 除非没有别的办法了否则不要用它



TerminateThread(my.handle,0)
myling 2003-07-14
  • 打赏
  • 举报
回复
某些紧急情况下,你可以使用TerminateThread()来终止一个线程。但是,除非没有别的办法了,否则不要用它。
例如,当线程代码陷入死循环时。TerminateThread()的声明如下:
function TerminateThread(hThread:THandle;dwExitCode:DWORD);TThread的Handle属性可以作为第一个参数,因此,TerminateThread()常这样调用:
TerminateThread(MyHosedThread.Handle,0)
如果选择使用这个函数,应该考虑到它的负面影响。
首先,此函数在Windows NT与在Windows 95/98下并不相同。在Windows 95/98 下,这个函数能够自动清除线程所占用的栈;而在Windows NT下,在进程被终止前栈仍然保留。
其次,无论线程代码中是否有try...finally块,
这个函数都会使线程立即停止执行。这意味着,被线程打开的文件没有被关闭、由线程申请的
内存没有被释放等情况。而且,这个函数在终止线程的时候也不通知D L L,当D L L关闭时,这也容易出现问题
duxin 2003-07-14
  • 打赏
  • 举报
回复
VOID ExitThread( UINT fuExitCode ); 结束自己

BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode);结束别的
666333 2003-07-14
  • 打赏
  • 举报
回复
up
truexeen 2003-07-14
  • 打赏
  • 举报
回复
请问用什么办法立即停止一个线程的执行呢?
---------------------------------------
这是不可能,没有"立刻"这种事情,Windows 都不是实时操作系统.

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧