这个事件的代码应该必须写成线程安全的吧?但是indy自带的“IdTCPDemo\Server”中的内容并不是线程安全的:既没用Synchronize(而是直接操作主线程VCL),也没用临界区等同步机制,是我想错了吗?
   我在OnExecute事件的代码中使用Synchronize时,居然编译报错:Missing operator or semicolon。而且我查看Synchronize,居然是windows中的一个const整数而不是一个过程。难道只是因为OnExecute事件是主线程的方法,就出了这么多问题吗?我应该怎样才能使用Synchronize呢?

解决方案 »

  1.   

    OnExecute事件传入的一个IdThread的参数
    才有Synchronize
      

  2.   

    "这个事件的代码应该必须写成线程安全的吧?"涉及到多线程都应该写成线程安全的.在任何一个线程中都一样.而线程安全是看你所访问的对象是否安全,不是说用Synchronize就是安全,不用Synchronize就是不安全.Synchronize只是保证线程安全的其中一个手段而已.
    ---------------------------------------
    "既没用Synchronize(而是直接操作主线程VCL),也没用临界区等同步机制,"这个例子之所以没有用这些东西是因为它基本上没有访问不安全的东西.在考虑线程安全的时候,应该把注意力放在可能会引起不安全的对象(比如某些全局变量等)上,而不用钻“安全”的牛角尖。
      

  3.   

    这个事件本身不就有一个IdThread的参数吗(AThread: TIdPeerThread)?请问你能给我一个可以编译通过的简单源码吗?
      

  4.   

    to mastersky:谢谢你的回答。请问如何在OnExecute事件中使用Synchronize呢?虽然这个事件很像TThread类的Execute过程,但是同样的Synchronize用法却无法通过编译
      

  5.   

    建议楼主不要在OnExecute刷新界面,否则会100% CPU占有率
      

  6.   

    to  numbbb:在OnExecute刷新界面时,无论是indy自带的demo还是我写的没考虑线程安全的程序,都不会100%   CPU占有率啊。
      

  7.   

    OnExecute事件已经是在主线程中了。不论你怎么用,都是会阻塞主线程的。所以不要在这个事件中执行需要时间较长的代码。
    再有一点,就是不明白楼主问这个问题的真正意图。
      

  8.   

    在《Indy In Depth》中对“Threaded Events”有这样的解释:TIdTCPServer events are threaded. This means that while they are not part of a thread class, they are executed from with in a thread.
    我的理解就是:OnExecute这样的TIdTCPServer events虽然看上去不是一个TThread的派生类,但实际上它是在单独的线程(而不是主线程)中运行的(这个事件的参数AThread: TIdPeerThread就是这个线程了)。
    既然是在单独的线程中运行,那么它要更新主线程的VCL就需要同步机制,但是通常使用的同步机制Synchronize在这里却无法通过编译。那么请问我应该怎样在OnExecute事件中安全的更新主线程的VCL呢?
      

  9.   

    Synchronize是Thread类的一个成员,TIdTCPServer不是从Thread继承过来的,在OnExecute消息中能传递过来一个参数叫AThread,这个是Thread类,
    AThread.Synchronize(xxx)但是Synchronize通常都没什么用,会阻塞界面。
      

  10.   

    to numbbb:谢谢你,接受答案了!