一个线程的问题,终于搞定了。

原创 2004年07月23日 19:48:00

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

线程函数
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,然后一直触发下去,
直到解析数据并显示。到这句就一直没有返回了。

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


 

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aatu/article/details/50212

简单说说Delphi中线程的释放

标签: delphiconstructor 2011-08-26 14:53 9202人阅读 评论(0) 收藏 举报  分类: Delphi编程(25)  版权声明:本文为博主原创文章,未经博...
  • nextop88
  • nextop88
  • 2017-09-08 17:15:50
  • 305

今天终于搞定了USB

      前几天装了ML1.2,什么都搞定了,就是USB搞不定。折腾了好几天。我以前是修改rc.sysinit,但是怎么改都不行。我的机器配置:PIV2.8GHz,512M,80G+40G(双硬盘)...
  • snail110
  • snail110
  • 2005-04-06 13:37:00
  • 892

linux wireless mouse

1、下面是写的一个无线或是有线鼠标测试程序 注:有线鼠标插入linux系统中是会在/dev目录下创建一个event0文件,但是无线鼠标插上后会有两个设备文件,一个是event0,另一个是event1;...
  • sonbai
  • sonbai
  • 2014-01-24 14:45:36
  • 2053

使用MinGW/GCC在C++语言中嵌入JavaScript脚本引擎SpiderMonkey

转自行者的足迹:http://blog.ccidnet.com/blog-htm-do-showone-uid-36246-type-blog-itemid-106110.html使用MinGW/GC...
  • ked
  • ked
  • 2008-03-14 23:26:00
  • 2845

终于搞定discuz的urlrewrite问题

自从使用了CPH的LAMP服务器之后,我就开始在上面试验一些php+mysql应用,其中首先弄的就是discuz了。安装了discuz6.0.0之后,基本上运行正常,但是一个最重要的功能urlrewr...
  • zfrong
  • zfrong
  • 2008-11-06 16:28:00
  • 4421

一个多线程synchronized引发的问题思考

/* * 查看程序,到底是输出多少? * */ public class TT implements Runnable { int b=0; public synchronized voi...
  • wxw520zdh
  • wxw520zdh
  • 2016-12-22 18:03:24
  • 293

axtoccontrol右键菜单 终于搞定了

第一步:右键菜单参数以及初始化 //右键菜单 // private ITOCControl2 pTocControl; private IMapCont...
  • qq_33222460
  • qq_33222460
  • 2018-03-19 11:48:22
  • 130

Linux线程的几种结束方式

Linux创建线程使用int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void...
  • himayan46
  • himayan46
  • 2015-11-17 11:41:22
  • 1324

【计蒜客系列】挑战难题2:整除问题

判断一个数是否能被另一个整数整除是一个挺简单的问题,一般一个模运算就可以搞定了,懒惰的晓萌还是不想自己做,于是找到你帮他写代码,你就帮帮他吧。 输入包括两个由空格分开的整数M和N(1≤M,N≤500)...
  • z9550695
  • z9550695
  • 2015-07-11 13:58:34
  • 455

MIPS 异常中断 代码分析 解决开发异常的好手册

  • 2009年04月22日 21:15
  • 1.53MB
  • 下载
收藏助手
不良信息举报
您举报文章:一个线程的问题,终于搞定了。
举报原因:
原因补充:

(最多只允许输入30个字)