delphi多线程问题,一个进程只能支持16个线程吗?(100分)

  • 主题发起人 主题发起人 cqwty
  • 开始时间 开始时间
C

cqwty

Unregistered / Unconfirmed
GUEST, unregistred user!
我测试了一下,delphi开发的程序,一个进程只能产生16个线程,有什么办法可以突破呢?
 
不是吧 这么少吗 开100个应该没问题啊
 
一千个也没有问题啊!
 
俺 曾经做过一个256的
 
羡慕,你们怎么动不动就开那么多线程?!
俺到现在做程序很少用线程的,
不太会用,:)
 
因为我做的是一个网络监控软件,需要监视很多设备,如果采用轮询的方式的话,达不到基本的效果,所以迫不得已,必须开多线程,一个设备一个线程,这样来做的。
 
每个程序的VM是2G,每个线程约占1M(经测试),理论上最大2K。
 
经过测试,发现由于线程里面使用了定时采集数据的办法,而使用timesetevent这个函数来设置定时器的循环间隔,而当增加到16个线程以后,第17个线程中,这个函数返回的值就成0了,这样就没法运行了,而对应的线程是构造了的。用过这个函数的大侠指点一下,谢谢。
 
线程池的处理是否得当?
 
我没有使用线程池来做,因为不知道客户到底会有多少设备需要监控,当然,肯定达不到windows限定的2000个线程这么多的设备,但是几十台设备,肯定没有问题的了,而我在线程中做的定时器用到了timesetevent这个函数,当创建第17个线程的时候,这个函数的返回值是0,我看了msdn,这个返回的值为NULL也就是delphi中的0值,那么就没有设置成功,所以线程的核心代码就不会运行了,而我在好几台电脑上测试过,确实只能创建16个,现在是怎么解决这个问题。
 
测试了一下,在一个delphi开发的应用程序中,最多只能创建16个有效的timesetevent。以下是测试代码,大家可以试试,不知道这个怎么解决,郁闷。怪不得我上面的线程只要超过16个后,第17个线程虽然创建了,但是就是不定时采集数据,原因在此,至于怎么解决,我也在看msdn,如果有遇到这个问题的大侠,麻烦指点一下,谢谢。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, mmsystem, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
timerid: array [1..20] of integer;
htimerevent:array [1..20] of Thandle;
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
for I := 1 to 20do
begin
htimerevent := CreateEvent(nil, False, False, nil);
timerid := timesetevent(I*1000,0,TFNTimecallback(htimerevent),0,time_periodic or time_callback_event_set);
memo1.Lines.Add(inttostr(timerid)+ ' '+'getlasterror:'+ inttostr(getlasterror()));
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
I: Integer;
begin
for I := 1 to 20do
begin
timekillevent(timerid);
CloseHandle(htimerevent);
end;
end;
上面的程序返回的结果如下:(当然,每次返回的值是不一样的,但是后面四个都是0,这个结果也验证了问题的所在。)
16 getlasterror:0
33 getlasterror:0
50 getlasterror:0
67 getlasterror:0
84 getlasterror:0
101 getlasterror:0
118 getlasterror:0
135 getlasterror:0
152 getlasterror:0
169 getlasterror:0
186 getlasterror:0
203 getlasterror:0
220 getlasterror:0
237 getlasterror:0
254 getlasterror:0
271 getlasterror:0
0 getlasterror:0
0 getlasterror:0
0 getlasterror:0
0 getlasterror:0

end.
 
经过几个小时的忙碌和查找,问题找到了,多媒体定时器在同一个process里面,只支持16个,但是我看了msdn上的说明,最大能支持到512个,但是需要重新创建一个timer队列。可是需要用到好几个api函数,而且挺复杂的了。换了另外一种方式来实现,明天晚上贴上来,用的是createwaitabletimer来做的,效果已经达到了,这个创建出来不受到数量的限制了.
 
就是线程定时器?
类似的应用我都是自己开 NN 个线程然后反复用 waitforsingleobject 休眠实现 timer 功能的
 
windows系统只允许在一进程中设置16个时钟。
 
TO cqwty,我也想做一个网络监测的东东,可以记录每台机器每条线路的通断时间。能否借用你的代码学习一下?如果可以,请回复wind8bell@163.com
 
如果你只是检测每台计算机的通断的话,就一个ping就可以了,其他的没有什么.
 
呵呵 一个线程,占1MB内存??
 
多人接受答案了。
 
后退
顶部