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

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

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


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

当一个线程进入一个对象的synchronized() 方法后,其他线程是否可以进入此对象的其他方法

当一个线程进入一个对象的synchronized() 方法后,其他线程是否可以进入此对象的其他方法? 1、其他方法generalMethod() 没有加入synchronized修饰符 package...
  • hsgao_water
  • hsgao_water
  • 2015年08月14日 16:36
  • 354

Thread多线程学习(二),java多线程中synchronize锁的使用和学习

synchronize我的理解是为了保证程序中的原子性和一致性,即当你有两个线程同时操作一段代码的时候,要让这段代码的执行是在任何状态下都是正确的,首先要保证synchronize的使用要对同一个对象...
  • a347911
  • a347911
  • 2016年11月15日 11:12
  • 774

java多线程和synchronize锁

一、线程的5个状态 1.创建状态 线程对象被创建后,就进入了新建状态。此时它和其他Java对象一样,仅仅由Java虚拟机分配了内存,并初始化其成员变量值。 2.就绪状态  也被称为...
  • qq_36047892
  • qq_36047892
  • 2017年11月19日 21:55
  • 55

Delphi中多线程同步过程Synchronize的一些说明

在windows原生应用程序开发中,经常伴随多线程的使用,多线程开发很简单,难点就是在于线程的同步,在Delphi中提供了VC中不具备的一个过程Synchronize,使用起来非常方便,解决了很多VC...
  • gogogo
  • gogogo
  • 2013年08月21日 11:41
  • 13413

终于搞定了一个小软件

首先感谢一下using MySql.Data.MySqlClient;    这个接口让我
  • oXiaoYu123456
  • oXiaoYu123456
  • 2014年08月11日 20:03
  • 447

解决线程同步带来的访问冲突问题

线程的同步也可以称为并发,由于进程是处理机分配资源的最小单位, 就会出现多个线程共同享用一个资源的想象,在带来方便的同时也带来了访问资源冲突这个严重的问题, JAVA语言在提供了专门机制解决这种冲...
  • Bazingaea
  • Bazingaea
  • 2016年05月30日 16:41
  • 1720

Synchronize实现原理(很难)

在C程序代码中我们可以利用操作系统提供的互斥锁来实现同步块的互斥访问及线程的阻塞及唤醒等工作。然而在Java中除了提供Lock API外还在语法层面上提供了synchronized关键字来实现互斥同步...
  • zbuger
  • zbuger
  • 2016年03月31日 22:25
  • 1502

NSUserDefaults性能优化问题

概述 NSUserDefaults(官方文档)普遍用在存储用户定制数值,或者程序中需要存一个数据的场景。当NSUserDefaults写入文件后,其值会存在应用沙盒下的Library/Prefe...
  • wwwang89123
  • wwwang89123
  • 2015年06月07日 16:16
  • 2081

synchronize的实现原理(偏向锁)

1 介绍  当一个线程试图访问同步的代码时,会首先尝试获取锁。执行完毕或者抛出异常的时候会主动释放锁。否则会一直阻塞着。     1.1 实现原理     从JVM规范中可以看到synchroniz...
  • a1211529911
  • a1211529911
  • 2016年05月24日 11:31
  • 1729

【线程同步】java实现生产者消费者问题与线程中的wait与notify总结

JAVA解决线程模型有三种方式,只讲一种:   1、wait()和notify()
  • robert_lizhiqiang
  • robert_lizhiqiang
  • 2014年09月15日 14:41
  • 1114
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个线程的问题,终于搞定了。
举报原因:
原因补充:

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