控制台程序使用TThread

WinSockCF 2011-04-12 12:51:15

program Project1;

{$APPTYPE CONSOLE}

uses
Windows,SysUtils,
Unit1 in 'Unit1.pas';

var
i:Integer;
Addnum:array[0..9] of TAddNumThread;
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
for I := 0 to 9 do
begin
Addnum[i] :=TAddNumThread.Create(True);
Addnum[i].FreeOnTerminate :=True;
Addnum[i].Start;
end;
Readln; //不使用这个线程没运行完,程序就关闭了
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.




在创建线程后加入了Readln;才能保证线程正常运行完成,但是不好的一点就是最后要按一下回车,窗口才会关闭

如何写代码让程序等待所有线程运行完自动关闭呢?

把Readln换成WaitForMultipleObjects的话,

WaitFormMultipleObjects(10,@Addnum,True,INFINITE);

一直等待创建的这10个线程完成,可是没一点作用!
...全文
134 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
WinSockCF 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wxieyang 的回复:]
Delphi(Pascal) code
var
i:Integer;
Addnum:array[0..9] of THandle;
begin
try
for I := 0 to 9 do
begin
with TAddNumThread.Create(True) do
begin
Addnum[I] := H……
[/Quote]


谢谢你!~刚又看了一下帮助,原来是个Thandle指针.!

还有噢,为什么WaitForMultipleObjects这个函数只能支持最大等待64个线程呢?

如果我想设置为100个线程,那该如何修改此代码?
Mit1208 2011-04-13
  • 打赏
  • 举报
回复

for i:=0 to 99 do
begin
addnum[i].waitfor;
addnum[i].free;
end;


用你原来的代码,把Addnum[i].FreeOnTerminate :=True;去掉
然后把Readln;换成上边代码就可以了!
WinSockCF 2011-04-13
  • 打赏
  • 举报
回复
问题已解决,谢谢各位!
thx1180 2011-04-13
  • 打赏
  • 举报
回复
这个程序压根儿没必要用线程嘛,线程代码直接放在主程序中。。。
wintergoes 2011-04-13
  • 打赏
  • 举报
回复
设置一个全局变量ThreadCount

开始初始化为0

开始线程(for语句)前ThreadCount := length(Addnum);

在每个线程的destroy里用InterlockedDecrement(ThreadCount)

线程开始后(for语句后),用一个while 语句判断直到ThreadCount为0

while ThreadCount > 0 do
Sleep(10);
wxieyang 2011-04-12
  • 打赏
  • 举报
回复
var
i:Integer;
Addnum:array[0..9] of THandle;
begin
try
for I := 0 to 9 do
begin
with TAddNumThread.Create(True) do
begin
Addnum[I] := Handle;
FreeOnTerminate :=True;
Start;
end;
end;
WaitFormMultipleObjects(10,@Addnum,True,INFINITE);关闭了
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
wxieyang 2011-04-12
  • 打赏
  • 举报
回复
WaitForMultipleObjects函数使用错误
你应该让你程序中的 Addnum[i].handle组成一个数组,然后用这个数字调用
WaitForMultipleObjects
而不是你程序中给出的线程对象指针数组作为等待数组
WinSockCF 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sforiz 的回复:]
你线程在做什么呢?
主程序创建线程后就退出了,其它线程当然也跟着退出了。你不能让主线程在其它线程没运行完就退出。
检测创建的线程是否都能出(销毁)了,是则关闭程序
[/Quote]

只是执行了一些数值相加的动作.

怎么把Readln;换成其它的?

比如等待线程执行完的代码或其它的都可以

使用WaitForMultipleObjects的话也不行.不知道怎么改,才能增加控制台的运行期~
dinoalex 2011-04-12
  • 打赏
  • 举报
回复
你有10个线程,可以定义 t: integer; t:= 1; 每个线程执行完后 inc(t)

主程序里 while t < 10 do ...
sforiz 2011-04-12
  • 打赏
  • 举报
回复
你线程在做什么呢?
主程序创建线程后就退出了,其它线程当然也跟着退出了。你不能让主线程在其它线程没运行完就退出。
检测创建的线程是否都能出(销毁)了,是则关闭程序

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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