首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

请教个TIdTCPServer的OnExecute有关问题

2012-02-16 
请问个TIdTCPServer的OnExecute问题这个事件的代码应该必须写成线程安全的吧?但是indy自带的“IdTCPDemo\Se

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

[解决办法]
OnExecute事件传入的一个IdThread的参数
才有Synchronize
[解决办法]
"这个事件的代码应该必须写成线程安全的吧?"

涉及到多线程都应该写成线程安全的.在任何一个线程中都一样.

而线程安全是看你所访问的对象是否安全,不是说用Synchronize就是安全,不用Synchronize就是不安全.Synchronize只是保证线程安全的其中一个手段而已.
---------------------------------------
"既没用Synchronize(而是直接操作主线程VCL),也没用临界区等同步机制,"

这个例子之所以没有用这些东西是因为它基本上没有访问不安全的东西.在考虑线程安全的时候,应该把注意力放在可能会引起不安全的对象(比如某些全局变量等)上,而不用钻“安全”的牛角尖。
[解决办法]
Synchronize是Thread类的一个成员,TIdTCPServer不是从Thread继承过来的,在OnExecute消息中能传递过来一个参数叫AThread,这个是Thread类,
AThread.Synchronize(xxx)

但是Synchronize通常都没什么用,会阻塞界面。

热点排行