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

在Thread中使用TClientSocket的疑問

答題得分者是:jow
shihyi
一般會員


發表:8
回覆:12
積分:4
註冊:2009-01-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-04-13 13:44:48 IP:112.78.xxx.xxx 訂閱
各位先進,

事情是這樣的
我把我要送出的資料先填在一塊陣列裡
然後透過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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-04-14 09:50:42 IP:60.249.xxx.xxx 未訂閱

我想下
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-04-14 10:27:45 IP:112.78.xxx.xxx 訂閱
非常謝謝您的回覆
我有逐行看了一下程式
比較困擾的是
在Thread中,不管是ClientSocket.Active或是ClientSocket.Stock.Connected都不會變成True
即使我用了Sleep來等待也是相同的結果
不曉得是什麼問題
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-04-14 12:11:07 IP:112.104.xxx.xxx 未訂閱

[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 begin
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-04-15 15:33:49 IP:112.78.xxx.xxx 訂閱
謝謝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]


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