全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1749
推到 Plurk!
推到 Facebook!

請教TTcpServer元件內部實作問題?

尚未結案
iamjsn
初階會員


發表:78
回覆:95
積分:44
註冊:2002-08-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-19 10:04:09 IP:203.204.xxx.xxx 未訂閱
最近在研究TTcpServer元件,發現幾個地方,一直沒辦法了解 因為對socket的關念不是粉清楚,想請教一下先進元件裏幾段source的用意    //問題一:FetchClientSocketThread的作用 TTcpServer元件Create了一個thread(TServerSocketThread)去作listen和accept,Execute裏有一個FetchClientSocketThread,它的實作用意我一直看不懂,我測試時同一隻Client端程式,先後連上Server 3次,發現FetchClientSocketThread只有第一次連線時會跑進去 而且裏面有一段 FPoolIndex := (FPoolIndex + 1) mod FThreadPool.Count;   更不知它寫成這樣的用意是什麼,看不懂???    //問題二:TServerSocketThread.FThreadPool扮演的角色 還有一個問題就是TServerSocketThread裏有一個FThreadPool: TList;變數,但發現它只有在AddClientSocketThread才會做add,我測試時Client端連上來三次,也只始終add過一次,不知這個FThreadPool何時才會被ADD多次,它的作用是什麼??     
 
//-----------------------------------------------------------
procedure TServerSocketThread.Execute;
var
  T: TClientSocketThread;
begin
  while not Terminated and Assigned(FServerSocket) and FServerSocket.Listening do
  begin
    if FServerSocket.WaitForConnection then  //等待connect
      if not Terminated then
      begin
        T := FetchClientSocketThread; // ??這段實作看不懂,貼在下面
        if not Assigned(T) then
          T := AddClientSocketThread;//??這裏會做FThreadPool.add
        if Assigned(T) then
          T.Resume;
        Sleep(0);
      end;
  end;
end;
//--------------------------------------------------------------    function TServerSocketThread.FetchClientSocketThread: TClientSocketThread;
var
  IndexRef: Integer;
begin
  Result := nil;
  if Assigned(FServerSocket) and (FThreadPool.Count > 0) then
  begin
    IndexRef := FPoolIndex;
    repeat
      FPoolIndex := (FPoolIndex   1) mod FThreadPool.Count;  //這段用意是在做什麼??
      Result := FThreadPool[FPoolIndex];
    until (FPoolIndex = IndexRef) or Result.Suspended;
    if not Result.Suspended then
      Result := nil;
  end;
end;        
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-28 21:47:15 IP:211.74.xxx.xxx 未訂閱
iamjsn 你好 一、FetchClientSocketThread 接收來自Client 的連線,因為是Thread 有可能有許多個client 同時連入 但是程式裡,使用輪詢處理 例: FPoolIndex := (FPoolIndex + 1) mod FThreadPool.Count;     mod 的妙用在於此,假設FThreadPool.Count=10;若有15條連線,超過FThreadPool.Count時,  就是說…它同時間內 FPoolIndex 的編號只有0~9,超過9 的,我想猜應該是不會被處理吧    二、這個應該是"連線數"-->同時在線上的client 數, 而不是"連線次數"--->client 登入幾次 一個連線,連上時…它會增加一次,換句話說,你如果同時開三、四個client 它應該會顯多個連線(三、四個)    PS:這是我用Indy 9.0 的 TCPServer /TCPClient 的心得:p 不知道有沒有一樣? < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=8147403&CC=182217"> 發表人 - ddy 於 2003/03/28 21:52:33
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-04-26 13:52:48 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-05-05 1:28:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!