首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 使用 AThread.Connection.ReadLn() 读取字符串时候为什么会卡住? [已结帖,结帖人:kernelj]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kernelj
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-18 15:33:27 楼主
    使用 AThread.Connection.ReadLn() 读取字符串时候整个程序会卡住,后面的线程无法进行处理。这个是为什么呢?

    当我变成 使用 AThread.Connection.Readstring(n) (n为小于该字符串的一个数值)这样子就可以读取,当n超过字符串的长度的时候又会卡住。

    要怎么解决这个问题呢?
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jasonke
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-18 16:10:551楼 得分:25
    因为Readstring内部是这样的
      repeat
        sleep
      until socket读到的字符 >= 要读的长度


    简称同步方式的网络模型
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kernelj
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-18 16:37:182楼 得分:0
    我的問題應該如何解決呢。我在使用 readln 如何防止卡住。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • shuihan20e
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-18 16:48:053楼 得分:0
    不会吧,楼主是不是用的IdTCPServer?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kernelj
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-18 16:54:364楼 得分:0
    是啊,是 IdTCPServer
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fenger8293
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-18 17:15:225楼 得分:25
    ReadLn读取的时候必须遇到#13#10才会返回.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kernelj
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-18 18:34:106楼 得分:0
    引用 5 楼 fenger8293 的回复:
    ReadLn读取的时候必须遇到#13#10才会返回.


    那如果我這樣 readln('',5000) 是不是在5ms之內就會自動退出 在沒有讀到數據的情況下?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kernelj
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-18 19:59:407楼 得分:0
    引用 1 楼 jasonke 的回复:
    因为Readstring内部是这样的
      repeat
        sleep
      until socket读到的字符 >= 要读的长度


    简称同步方式的网络模型


    我應該怎么過濾掉那些有害的數據,也就是 如果我用 readstring 他的字符不夠 長度就會一直停在那里 直到程序死掉,我怎么去防止這樣的事情發生。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kernelj
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-19 10:41:538楼 得分:0
    按照这个方法来做了,但是似乎没有结果。

    编程中遇到了难解的问题。
    s:=IdTCPClient.ReadLn(#$A, 5);
    就是不在timeout时间后跳出。

    上indy网站search bug,找到了这个链接
    http://sourceforge.net/tracker/?group_id=41862&atid=431491&func=detail&aid=500888

    里面提到了两种解决方案
    Change this in last portion of ReadFromStack():

    ...
    until (LByteCount <> 0) or (Connected = False);
    ...

    to:

    ...
    until (LByteCount <> 0) or (Connected = False) or (Result
    = -1);
    ...

    还有一种
    Current faulty situation in ReadFromStack() at Line 427
    (Beta 9.0.3-B):

    ...
    // Timeout
    if ARaiseExceptionOnTimeout then begin
    raise EIdReadTimeout.Create(RSReadTimeout);
    end;
    Result := -1;
    ...

    Change this to:

    ...
    // Timeout
    Result := -1; // MOVED!
    if ARaiseExceptionOnTimeout then begin
    raise EIdReadTimeout.Create(RSReadTimeout);
    end else // ADDED!
    break; // ADDED!
    ...

    两种方法都试过,改完在CMD下面用
    dcc32 IdTCPConnection.pas
    编译后,把DCU文件放到lib目录下,替换原始的dcu文件,还是不行。。。。

    苦恼中。。。。

    继续看源码。。。。

    因为无法跟踪IdTCPConnection.pas里的错误,复制该文件到我的工程文件夹下,设置断点,呵呵!可以跟踪调试了。

    发现在readln()的实现里,有一句
    FReadLnTimedOut := ReadFromStack(True, ATimeout, ATimeout = IdTimeoutDefault) = 0;

    可是在ReadFromStack里,如果timeout,结果始终是-1的。。。
    试着把最后的0改为-1。程序通过了。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved