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

用indy8 的TidTCPServer做一个接收数据的服务端,我想把收到的数据在memo中同步显示出来,如何实现??

尚未結案
sdshw
一般會員


發表:8
回覆:11
積分:3
註冊:2008-03-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-03-24 20:52:30 IP:218.58.xxx.xxx 訂閱
用indy8 的TidTCPServer做一个接收数据的服务端,我想把收到的数据在memo中同步显示出来,如何实现??
显示数据时,因为要访问VCL,所以要用AThread.Synchronize(ShowData);
但是如何传递参数啊,例如:

[code delphi]
procedure TMainForm.IdTCPServer1Execute(AThread: TIdPeerThread);

var

s: TMemoryStream;

begin

s := TMemoryStream.Create;

try

AThread.Connection.ReadStream(s, -1, False);

//如何在此显示s中的数据

//AThread.Synchronize(ShowData);????,如何将s传给ShowData???

//如果将s放在本单元的private区,还是不能保证多个客户端连接的线程同时访问s情况啊



finally

s.Free;

AThread.Stop;

end;

end;



[/code]
RootKit
資深會員


發表:16
回覆:357
積分:419
註冊:2008-01-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-03-25 23:23:21 IP:61.222.xxx.xxx 訂閱
我的作法為了避免干擾multi-Thread 的運作,在主Form UI 上建立一 Timer 事件去刷新。
再接收端將資訊寫到暫存,在Timer 中讀取暫存。

另外使用你原來的作法,將 S 放在Thread 的Private 區。並透過AThread.Synchronize(ShowData)
ShowData 中引用。S為Thread私有變數不會受到引響。

jow
尊榮會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-03-26 00:40:22 IP:123.193.xxx.xxx 訂閱
資料傳輸,你可以參考這一篇

http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=90517

另外,Indy元件好像是Blocking connections, 此與範例程式(Non-Blocking)在實作上有些不同.

不過你仍然可以參考其中,對於資料封包的用法...


個人建議, 提供你參考
kmlsoft
一般會員


發表:1
回覆:5
積分:6
註冊:2003-11-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-04-22 09:44:23 IP:222.45.xxx.xxx 未訂閱
将要显示资料存储在公共变量,用POSTMESSAGE方式通知主线程更新,目前这个方法在线程中最有效。
sdshw
一般會員


發表:8
回覆:11
積分:3
註冊:2008-03-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-08-16 23:39:46 IP:119.162.xxx.xxx 訂閱
“S為Thread私有變數不會受到引響” 确实不会受到影响吗??

===================引 用 RootKit 文 章===================
我的作法為了避免干擾multi-Thread 的運作,在主Form UI 上建立一 Timer 事件去刷新。
再接收端將資訊寫到暫存,在Timer 中讀取暫存。

另外使用你原來的作法,將 S 放在Thread 的Private 區。並透過AThread.Synchronize(ShowData)
ShowData 中引用。S為Thread私有變數不會受到引響。

pcplayer99
尊榮會員


發表:142
回覆:740
積分:591
註冊:2003-01-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-08-30 01:00:40 IP:121.34.xxx.xxx 訂閱
如果作为 Thread 的私有的,当然不受影响。但如果在 Thread 里用同步方法去 show 到 memo1 里,对执行效率来说,不是好办法。
好办法应该是把收到的 string 丢进一个队列里,比如一个 stringList 里,然后 PostMessage 给主线程,让主线程去读那个 StringList 里的 string 然后拿出来显示。

当然, TStringList 不是线程安全的,你可以自己加上 CriticalSection来保证。


===================引 用 sdshw 文 章===================
“S為Thread私有變數不會受到引響” 确实不会受到影响吗??

===================引 用 RootKit 文 章===================
我的作法為了避免干擾multi-Thread 的運作,在主Form UI 上建立一 Timer 事件去刷新。
再接收端將資訊寫到暫存,在Timer 中讀取暫存。

另外使用你原來的作法,將 S 放在Thread 的Private 區。並透過AThread.Synchronize(ShowData)
ShowData 中引用。S為Thread私有變數不會受到引響。

sdshw
一般會員


發表:8
回覆:11
積分:3
註冊:2008-03-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-10-22 10:44:36 IP:60.208.xxx.xxx 訂閱
我感觉用 CriticalSection 机制的话,好像跟AThread.Synchronize()是 一个道理

===================引 用 pcplayer99 文 章===================
如果作为 Thread 的私有的,当然不受影响。但如果在 Thread 里用同步方法去 show 到 memo1 里,对执行效率来说,不是好办法。
好办法应该是把收到的 string 丢进一个队列里,比如一个 stringList 里,然后 PostMessage 给主线程,让主线程去读那个 StringList 里的 string 然后拿出来显示。

当然, TStringList 不是线程安全的,你可以自己加上 CriticalSection来保证。

編輯記錄
sdshw 重新編輯於 2008-10-22 10:46:12, 註解 無‧
sdshw
一般會員


發表:8
回覆:11
積分:3
註冊:2008-03-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-11-01 17:48:21 IP:123.233.xxx.xxx 訂閱
请大家看代码

[code delphi]
type
TMainForm = class(TForm)
Memo1: TMemo;
TCPServer: TIdTCPServer;
procedure FormCreate(Sender: TObject);
procedure TCPServerExecute(AThread: TIdPeerThread);

private
FData: string;
public
procedure ShowData;
end;

procedure TMainForm.IdTCPServer1Execute(AThread: TIdPeerThread);
var
s: string;
begin
try
s := AThread.Connection.ReadLen();
FData := s;
//因为要访问MainForm中的Memo,所以要Synchronize
//由于FData是主线程中的变量, 而不是AThread中的变量
//这样做是安全的吗?
//不安全的话,应该怎么做最好?
//用Sendmessage(MainForm.Handle, .....)的方式可行吗?
AThread.Synchronize(ShowData);

finally
AThread.Disconnect;
end;
end;

procedure TMainForm.ShowData;
begin
MainForm.Memo1.lines.add(FData);
end;

[/code]
編輯記錄
sdshw 重新編輯於 2008-11-01 22:06:19, 註解 無‧
系統時間:2017-12-16 13:07:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!