午夜听风的代码人生

吾生也有涯,而知也无涯。以有涯随无涯,殆已

用户操作
[即时聊天] [发私信] [加为好友]
午夜听风ID:aatu
43261次访问,排名2739(1),好友0人,关注者0人。
aatu的文章
原创 65 篇
翻译 0 篇
转载 4 篇
评论 42 篇
午夜听风的公告

欢迎光临
网名:午夜听风
msn:windy79@hotmail.com
爱好:喜读书,不求甚解!!!


天气预报

最近评论
Hong liang:我也很喜欢这首歌。
qq:一直很喜欢这首曲子,第一次听是在看<三少爷的剑>时.
歌词很有气势,很宏大的感觉.很能振奋精神.
以后也会一直喜欢,只是不知道可有在线听么?
希望能提供这种功能.
laura:佩服佩服,希望早日看到你写的书,为我们指点迷津,使我们在书海中不至于迷茫。另,你用什么写的
sdfsd:asd
2:纪敏佳真的很棒
文章分类
收藏
相册
朋友
其他
OO
使用oo设计聊天室
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 一个线程的问题,终于搞定了。收藏

新一篇: 接口 | 旧一篇: 架构,苦思ing……

昨天调了一下午加一晚上,原来是这样。

线程函数
procedure TTCPClientHandleThread.Execute;
begin
  ……
    while not Terminated do
    begin
        if FIdTCPClient.Connected then
        begin
            try
                 FRxString := FRxString + FIdTCPClient.ReadChar;
                 FEndOfPacket := False;
            except
                if not FEndOfPacket then
                begin
                    FEndOfPacket := True;
                    FDataList.data := FRxString;
                    
Synchronize(HandleInput); //就是这句
                     //改成发消息了 
                     //PostMessage(ReceiveHandle, WM_TCPRECEIVEDATA, 0, 0);

                    FRxString := '';
                end;
           end;
        end;
     end
    else
    begin
      CodeSite.SendMsg('TTCPClientHandleThread:未连接');
      sleep(1000);
    end;
  end;
end;

procedure TTCPClientHandleThread.HandleInput;
begin
  //下面触发事件,然后FOnReceiveData里面继续触发,一直到把数据解析完
  if Assigned(FOnReceiveData) then
    FOnReceiveData(self, PChar(FRxString), Length(FRxString));
end;

基本功能
一个用来接收数据的线程。
Indy的阻塞方式用起来很别扭,tcp读数据非要给定长度,如果缓存里面的数据小于
这个长度,接收就阻塞了。而我需要的功能仅仅是读出缓存里面的所有数据。
没找到直接的实现方法,所以写了这个线程。
循环ReadChar。如果有数据,返回数据。
如果没有数据,ReadChar会阻塞,直到超时,发生异常。
把超时设为100ms或其他数据,这样就可以读到这一段时间内的所有数据。

问题现象:
有的时候能接收,有的时候不能,没有什么明显的规律。
以前写过一个小程序用到这个类,没什么问题。这次放到大系统里面就有问题。
好像第一次接收是正常的,以前程序还能正常用很长时间。
现在第二次接收就收不到了。

找了好久,反复跟踪,感觉是线程第一次接收以后就停了。
以为是suspend或者terminate了,反复查反复查。

最后终于发现,Synchronize(HandleInput)

这句调用了HandleInput,然后触发FOnReceiveData,然后一直触发下去,
直到解析数据并显示。到这句就一直没有返回了。

改成发送消息,线程继续运行。


 

发表于 @ 2004年07月23日 19:48:00|评论(loading...)|编辑

新一篇: 接口 | 旧一篇: 架构,苦思ing……

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 午夜听风