線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2125
推到 Plurk!
推到 Facebook!

请教indy10 中TIdSchedulerOfThreadPool组件用法

答題得分者是:GrandRURU
zhweizw
一般會員


發表:7
回覆:16
積分:9
註冊:2008-01-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-05-04 09:54:49 IP:218.3.xxx.xxx 訂閱
各位大大,小弟用在使用indy10 IdSchedulerOfThreadPool组件时遇到问题,请指点迷津

小弟以前做服务器端使用IdTcpServer时经常与IdSchedulerOfThreadDefault组合,最近学习使用IdSchedulerOfThreadPool组件,我的使用方法是:
1、将IdTcpserver.Scheduler属性指向IdSchedulerOfThreadPool组件;
2、IdSchedulerOfThreadPool组件属性设置:Poolsize:=5 MaxThreads:=50
服务器端运行程序后,若客户端连线超过5条,服务器会自动创建新的线程。但问题是,当有客户端断开连线时,服务器端的线程也随之减少,并不像我期待的那样“服务器端自动把空闲的线程放入Pool备用”,这样一来,IdSchedulerOfThreadPool起不到线程池的作用了,问题出在什么环节呢?是不是使用IdSchedulerOfThreadPool组件时需要编写其他代码?

请大大指教,不胜感激!
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-05-04 12:25:21 IP:59.120.xxx.xxx 未訂閱
IdSchedulerOfThreadPool把它的poolsize設大一點就可以了,不是嗎?

請參閱:
http://www.77di.com/f2/25860.html

===================引 用 zhweizw 文 章===================
各位大大,小弟用在使用indy10 IdSchedulerOfThreadPool组件时遇到问题,请指点迷津

小弟以前做服务器端使用IdTcpServer时经常与IdSchedulerOfThreadDefault组合,最近学习使用IdSchedulerOfThreadPool组件,我的使用方法是:
1、将IdTcpserver.Scheduler属性指向IdSchedulerOfThreadPool组件;
2、IdSchedulerOfThreadPool组件属性设置:Poolsize:=5 MaxThreads:=50
服务器端运行程序后,若客户端连线超过5条,服务器会自动创建新的线程。但问题是,当有客户端断开连线时,服务器端的线程也随之减少,并不像我期待的那样“服务器端自动把空闲的线程放入Pool备用”,这样一来,IdSchedulerOfThreadPool起不到线程池的作用了,问题出在什么环节呢?是不是使用IdSchedulerOfThreadPool组件时需要编写其他代码?

请大大指教,不胜感激!
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-05-04 13:01:44 IP:210.64.xxx.xxx 訂閱
你好,你所指的斷開連線是正常的close連線,還是不正常的,如:把網路線直接拉下來?

理論上正常close的連線應該會釋放。而異常的斷線則可能要等至少2MSL(Max Segment Lifetime)的時間才會偵測到斷。

此外,若你目前已是8個thread,而你的pool是5,那斷線的那條thread是非pool的那個socket,則pool當然是沒釋放。若斷的是pool上的socket,除非是不正常的斷線,否則sokcet會被釋放,並且讓此thread 可再被度被利用。

===================引 用 zhweizw 文 章===================
当有客户端断开连线时
------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2011-05-03 23:06:53, 註解 無‧
zhweizw
一般會員


發表:7
回覆:16
積分:9
註冊:2008-01-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-05-06 00:20:34 IP:114.234.xxx.xxx 訂閱
大大您好,可能是我没有把问题描述清晰,我再重新描述一遍:
SchedulerOfThreadPool属性设置:PoolSize:=5;MaxThreads:=50;
服务器端执行后,会自动创建5条Thread用来处理客户端数据,这5条Threads应该属于Pool,对吗?此时若客户端连线不大于5条,服务器端不会再创建新的Thread,若大于5条,每增加一个客户端连线,服务器端就会同时增加一个Thread。
现在的问题是,无论客户端连线是否超过了PoolSize设定的数量,只要有客户端断开连线(正常断开),Pool里面的Thread就会随之减少,若所有客户端都断开连线了,Pool里面Thread就是0条了,这样的SchedulerOfThreadPool 就没有了ThreadPool的功能了,为什么会这样呢?按照我的理解,客户端断开连线后,Socket可以被释放,但Thread应该放入Pool里面处于Suspended状态,待有新的的客户端连线的时候,从Pool里面Resume重新使用。但是SchedulerOfThreadPool并没有按照我想象的方式工作,是不是 使用这个元件另需编写代码?

===================引 用 aftcast 文 章===================
你好,你所指的斷開連線是正常的close連線,還是不正常的,如:把網路線直接拉下來?

理論上正常close的連線應該會釋放。而異常的斷線則可能要等至少2MSL(Max Segment Lifetime)的時間才會偵測到斷。

此外,若你目前已是8個thread,而你的pool是5,那斷線的那條thread是非pool的那個socket,則pool當然是沒釋放。若斷的是pool上的socket,除非是不正常的斷線,否則sokcet會被釋放,並且讓此thread 可再被度被利用。

===================引 用 zhweizw 文 章===================
当有客户端断开连线时
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-05-07 07:15:58 IP:111.249.xxx.xxx 未訂閱
請問你用的是indy10.?版?

有沒有試著更新版本呢?

===================引 用 zhweizw 文 章===================
大大您好,可能是我没有把问题描述清晰,我再重新描述一遍:
SchedulerOfThreadPool属性设置:PoolSize:=5;MaxThreads:=50;
服务器端执行后,会自动创建5条Thread用来处理客户端数据,这5条Threads应该属于Pool,对吗?此时若客户端连线不大于5条,服务器端不会再创建新的Thread,若大于5条,每增加一个客户端连线,服务器端就会同时增加一个Thread。
现在的问题是,无论客户端连线是否超过了PoolSize设定的数量,只要有客户端断开连线(正常断开),Pool里面的Thread就会随之减少,若所有客户端都断开连线了,Pool里面Thread就是0条了,这样的SchedulerOfThreadPool 就没有了ThreadPool的功能了,为什么会这样呢?按照我的理解,客户端断开连线后,Socket可以被释放,但Thread应该放入Pool里面处于Suspended状态,待有新的的客户端连线的时候,从Pool里面Resume重新使用。但是SchedulerOfThreadPool并没有按照我想象的方式工作,是不是 使用这个元件另需编写代码?

===================引 用 aftcast 文 章===================
你好,你所指的斷開連線是正常的close連線,還是不正常的,如:把網路線直接拉下來?

理論上正常close的連線應該會釋放。而異常的斷線則可能要等至少2MSL(Max Segment Lifetime)的時間才會偵測到斷。

此外,若你目前已是8個thread,而你的pool是5,那斷線的那條thread是非pool的那個socket,則pool當然是沒釋放。若斷的是pool上的socket,除非是不正常的斷線,否則sokcet會被釋放,並且讓此thread 可再被度被利用。

===================引 用 zhweizw 文 章===================
当有客户端断开连线时
zhweizw
一般會員


發表:7
回覆:16
積分:9
註冊:2008-01-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-05-09 09:43:15 IP:218.3.xxx.xxx 訂閱
我是在delphi 2010 环境下,使用indy10.5.5版本测试的
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-05-09 09:52:44 IP:59.120.xxx.xxx 未訂閱
那…暫時可能沒人能回答這個問題了

不過你可以試著到
http://tech.groups.yahoo.com/group/Indy-Dev-Public/

Indy 開發團隊的Yahoo Groups去提問
應該就能夠得到解決了

Good Luck!

===================引 用 zhweizw 文 章===================
我是在delphi 2010 环境下,使用indy10.5.5版本测试的
系統時間:2017-10-24 1:05:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!