这个事件的代码应该必须写成线程安全的吧?但是indy自带的“IdTCPDemo\Server”中的内容并不是线程安全的:既没用Synchronize(而是直接操作主线程VCL),也没用临界区等同步机制,是我想错了吗?
我在OnExecute事件的代码中使用Synchronize时,居然编译报错:Missing operator or semicolon。而且我查看Synchronize,居然是windows中的一个const整数而不是一个过程。难道只是因为OnExecute事件是主线程的方法,就出了这么多问题吗?我应该怎样才能使用Synchronize呢?
我在OnExecute事件的代码中使用Synchronize时,居然编译报错:Missing operator or semicolon。而且我查看Synchronize,居然是windows中的一个const整数而不是一个过程。难道只是因为OnExecute事件是主线程的方法,就出了这么多问题吗?我应该怎样才能使用Synchronize呢?
才有Synchronize
---------------------------------------
"既没用Synchronize(而是直接操作主线程VCL),也没用临界区等同步机制,"这个例子之所以没有用这些东西是因为它基本上没有访问不安全的东西.在考虑线程安全的时候,应该把注意力放在可能会引起不安全的对象(比如某些全局变量等)上,而不用钻“安全”的牛角尖。
再有一点,就是不明白楼主问这个问题的真正意图。
我的理解就是:OnExecute这样的TIdTCPServer events虽然看上去不是一个TThread的派生类,但实际上它是在单独的线程(而不是主线程)中运行的(这个事件的参数AThread: TIdPeerThread就是这个线程了)。
既然是在单独的线程中运行,那么它要更新主线程的VCL就需要同步机制,但是通常使用的同步机制Synchronize在这里却无法通过编译。那么请问我应该怎样在OnExecute事件中安全的更新主线程的VCL呢?
AThread.Synchronize(xxx)但是Synchronize通常都没什么用,会阻塞界面。