这个事件的代码应该必须写成线程安全的吧?但是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呢?
解决方案 »
- 关于循环编辑控件的问题
- 急等,如何用ShellExecute 打开一个带参数的程序 ShellExecute(handel,'open','isqlw www.sql',nil,nil,sw_show?
- 请各位大哥帮我看看这个奇怪的 scocket 问题,谢谢!
- 关于Image上面放置Label控件的问题
- DBGrid中能将其显示的数据条数限制在10条或是一定数值的条数么?
- 在线给分(关于query返回值)-不够再加
- 谁知道怎样编程实现远程控制另外一台计算机?(在线)
- 简单的问题
- 数据库的连接
- 有谁拿了zhuxiaojun的人事管理系统,给我一份行吗 ?
- TRealTimeForm是什么类
- 在上海混了一年多,想去北京发展,大家给个建议怎样过渡???
才有Synchronize
---------------------------------------
"既没用Synchronize(而是直接操作主线程VCL),也没用临界区等同步机制,"这个例子之所以没有用这些东西是因为它基本上没有访问不安全的东西.在考虑线程安全的时候,应该把注意力放在可能会引起不安全的对象(比如某些全局变量等)上,而不用钻“安全”的牛角尖。
再有一点,就是不明白楼主问这个问题的真正意图。
我的理解就是:OnExecute这样的TIdTCPServer events虽然看上去不是一个TThread的派生类,但实际上它是在单独的线程(而不是主线程)中运行的(这个事件的参数AThread: TIdPeerThread就是这个线程了)。
既然是在单独的线程中运行,那么它要更新主线程的VCL就需要同步机制,但是通常使用的同步机制Synchronize在这里却无法通过编译。那么请问我应该怎样在OnExecute事件中安全的更新主线程的VCL呢?
AThread.Synchronize(xxx)但是Synchronize通常都没什么用,会阻塞界面。