socket客户端使用阻塞模式,查了资料,说是要重载线程的Execute方法方法,文章在此http://geocom.hhcc.net.cn/magz/wk0202/7.htm。
小弟刚接触线程的编程,上面给出的代码不知该如何使用,望各位大侠给个详细的代码(代码框架也行),在主程序中又该如何处理?
问题解决后,立马给分。

解决方案 »

  1.   

    IndyDemos中的IdTCPDemo就是一个线程的例子
    到这下
    http://www.indyproject.org/download/Files/Indy9.html
      

  2.   

    谢谢楼上的,不过本人不准备用indy。
    用ClientSocket如何实现???哪位大拿知道的请指点一二。
    看了资料,说是要在OnConnect事件中起线程,这样做的话,是不是每个ClientSocket只能起一个线程呢?
      

  3.   

    你先熟悉一下线程的用法吧.
    如果在阻塞模式,可以在线程里动态创建这个CLIENTSOCKET.
    这种做法比较适用于客户-->服务,单向一问一答..另外,有一个高效使用TClientSocket的技巧.
    使用EVENT SELECT I/O方式,
    TSocketConnection是用它实现的,
    源码里面可以看TTransportThread.Execute的实现,(sconnect单元)
    看不懂没关系,呵呵.
      

  4.   

    to: halfdream(哈欠) 
    我现在是在线程里动态创建clientsocket(ctBlocking模式)的,用TWinSocketStream.Create(clientsoket.Socket,200)设置超时200ms,但是在目标机器关机的情况下,实际上在执行clientsoket.Active := True进行连接的时候,却要等10秒左右才会报10060(由于连接方在一段时间后没有正确的答复或连接的主机没有反应,连接尝试失败)的错误。
    另外还有个问题,当我的这个线程在运行的时候,程序主界面无法响应任何操作,这个好像很不正常,线程在运行的时候不是应该不会影响主进程的吗,您估计一般是程序上的哪些错误导致这种不正常现象的呢。
      

  5.   

    我线程中的一个循环过程对主程序中的memtable进行了操作,而主界面上dbgrid中显示的内容就是取自这个memtable的,会不会是由于这个原因导致程序无法响应的呢?但是我已经对这个循环过程进行Synchronize处理了啊。
      

  6.   

    在目标机器关机的情况下,进行连接的时候,
    要花较大时间才返回失败,这不是CLIENTSOCKET这组件特有的。
    一般阻塞方式SOCKET程序都是这样。。
    在多数情况下,这并不是什么问题。先放一边吧。。一旦建立好连接后,TWinSocketStream控制的是发送和接收超时。。-------------------------------
    呵呵。就因为你用了Synchronize
    Synchronize这东西,你想想同步的含义就有明白的。
    当你在工作线程中用Synchronize执行一段代码时,主线程就停下来
    让工作线程执行完这段代码。
    尽可能少用Synchronize,要用它,也要让它执行的时间尽可能短,
    否则,多线程处理事实上成了单线程处理。。甚至更糟。
      

  7.   

    谢谢 halfdream(哈欠) 的答复 :)
    那如果使用CriticalSection或是信号量的方法是否也同Synchronize是一样的效果呢?
    如果我将memtable中的数据暂存到一个主线程不会访问的文件中,工作线程通过访问这个文件来获得数据,处理完毕后再对memtable进行更新,是不是就能解决我的问题了呢?
      

  8.   

    CriticalSection同Synchronize本质相同你想的那思路是可行的,有很多类似做法,只是细节区别。
      

  9.   

    既然可行,那我就结帖了,碰到问题再发帖吧,谢谢各位达人的帮助,尤其要谢谢halfdream(哈欠)  :D