在Thread中使用TClientSocket的疑問 |
答題得分者是:jow
|
shihyi
一般會員 發表:8 回覆:12 積分:4 註冊:2009-01-03 發送簡訊給我 |
各位先進,
事情是這樣的 我把我要送出的資料先填在一塊陣列裡 然後透過Thread一直去看這塊陣列 有資料的話,就送出 Thread的程式碼如下 [code delphi] procedure SendPacketThread.Execute; begin while True do begin if SendBuffer_Counter > 0 then begin while SendBuffer_Lock do sleep(1); ClientSocket.Port := ClientPort; ClientSocket.Host := SendBuffer[SendBuffer_Counter].IP; ClientSocket.Active := True; ClientSocket.Socket.SendText(SendBuffer[SendBuffer_Counter].Contain); ClientSocket.Active := False; Dec(SendBuffer_Counter); end; end; end; [/code] 但是我發現一個滿奇怪的現象 在送出前,我要把ClientSocket.Active := True;,以及我在送完的時候要把ClientSocket.Active := False; 這兩行都沒有反應 就算我執行了ClientSocket.Active := True;,他還是等於False 不曉得是不是我哪邊寫錯 還是哪邊觀念錯了 還請各位先進指導 Best Regards, shihyi |
salo0610
高階會員 發表:42 回覆:120 積分:107 註冊:2003-02-18 發送簡訊給我 |
我想下 ClientSocket.Active := True;後 應該要等 ClientSocket1->Socket->Connected = true 才可以執行 SendText 吧 ===================引 用 shihyi 文 章=================== 各位先進, 事情是這樣的 我把我要送出的資料先填在一塊陣列裡 然後透過Thread一直去看這塊陣列 有資料的話,就送出 Thread的程式碼如下 [code delphi] procedure SendPacketThread.Execute; begin ? while True do ? begin ??? if SendBuffer_Counter > 0 then ??? begin ? while SendBuffer_Lock do ??? sleep(1); ? ClientSocket.Port := ClientPort; ? ClientSocket.Host := SendBuffer[SendBuffer_Counter].IP; ? ClientSocket.Active := True; ? ClientSocket.Socket.SendText(SendBuffer[SendBuffer_Counter].Contain); ? ClientSocket.Active := False; ? Dec(SendBuffer_Counter); ??? end; ? end; end; [/code] 但是我發現一個滿奇怪的現象 在送出前,我要把ClientSocket.Active := True;,以及我在送完的時候要把ClientSocket.Active := False; 這兩行都沒有反應 就算我執行了ClientSocket.Active := True;,他還是等於False 不曉得是不是我哪邊寫錯 還是哪邊觀念錯了 還請各位先進指導 Best Regards, shihyi |
shihyi
一般會員 發表:8 回覆:12 積分:4 註冊:2009-01-03 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
[code delphi] var Error: Boolean = False; procedure SendPacketThread.DoOnClientSocketError( Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin Error := True; end; procedure SendPacketThread.Execute; var Timeout: Cardinal; begin ClientSocket.OnError := DoOnClientSocketError; while True do begin if SendBuffer_Counter > 0 then begin while SendBuffer_Lock do sleep(1); ClientSocket.Port := ClientPort; ClientSocket.Host := SendBuffer[SendBuffer_Counter].IP; Timeout := GetTickCount 10*1000; Error := False; ClientSocket.Active := True; while GetTickCount if Error then Break; if ClientSocket.Active then Break; Application.ProcessMessages; end; if Error then begin //Connection Error end else if ClientSocket.Active then begin ClientSocket.Socket.SendText(SendBuffer[SendBuffer_Counter].Contain); ClientSocket.Active := False; end else begin //Connection Timeout end; Dec(SendBuffer_Counter); end; end; end; [/code] |
shihyi
一般會員 發表:8 回覆:12 積分:4 註冊:2009-01-03 發送簡訊給我 |
謝謝Jow前輩的回覆
我大概了解為什麼要這麼做了 稍微修改一下您的code,是可行的 不過最後我是用Indy10裡的IdTCPClient來解決這個問題 我使用IdTCPClient的程式碼如下 [code delphi] procedure SendPacketThread.Execute; var SendBuffer: PSendBuffer; begin while True do begin if SendBuffer_Counter > 0 then begin while SendBuffer_Lock do sleep(1); SendBuffer_Lock := True; with IdTCPClient do begin SendBuffer := SendBufQueue.Pop; Host := SendBuffer^.IP; Port := ClientPort; Connect; IOHandler.Write(SendBuffer^.Contain); Disconnect; Dec(SendBuffer_Counter); end; SendBuffer_Lock := False; end; end; end; [/code] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |