用indy8 的TidTCPServer做一个接收数据的服务端,我想把收到的数据在memo中同步显示出来,如何实现?? |
尚未結案
|
sdshw
一般會員 發表:8 回覆:11 積分:3 註冊:2008-03-24 發送簡訊給我 |
用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 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
資料傳輸,你可以參考這一篇
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 發送簡訊給我 |
|
sdshw
一般會員 發表:8 回覆:11 積分:3 註冊:2008-03-24 發送簡訊給我 |
“S為Thread私有變數不會受到引響” 确实不会受到影响吗??
===================引 用 RootKit 文 章=================== 我的作法為了避免干擾multi-Thread 的運作,在主Form UI 上建立一 Timer 事件去刷新。 再接收端將資訊寫到暫存,在Timer 中讀取暫存。 另外使用你原來的作法,將 S 放在Thread 的Private 區。並透過AThread.Synchronize(ShowData) ShowData 中引用。S為Thread私有變數不會受到引響。 |
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
如果作为 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 發送簡訊給我 |
我感觉用 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 發送簡訊給我 |
请大家看代码
[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, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |