IdUDPServer 控件的ThreadedEvent属性有什么作用?(100分)

  • 主题发起人 主题发起人 小胡
  • 开始时间 开始时间

小胡

Unregistered / Unconfirmed
GUEST, unregistred user!
在Indy的源码中 idUDPServer.pas中,224行:
if FServer.ThreadedEvent then begin
UDPRead;
end else begin
Synchronize(UDPRead);
end;
通过Synchronize来调用和不用有什么区别呢?会对通讯造成什么影响??
 
我想应该是一个跟多线程用关的属性,如果你的程序是用多线程来通讯的.那么就应该用Synchronize来读
 
关于Synchronize的一点解释
《Delphi4开发大全(上)》的P427中揭示了Synchronize的奥秘:“当您创建一个线程对象时,VCL会创建和维护一个隐含的线程窗口。这个窗口的作用是把通过Synchronize()调用的方法排队。Synchronize把通过Method参数传递过来的方法保存在TThread的FMethod字段中,然后把一个CM_EXECPROC消息发给线程窗口,并且把消息的lParam参数设为Self(这里就是线程对象)。当线程窗口的窗口程序收到这个消息,它就调用FMethod字段所指定的方法。由于线程窗口是在主线程内创建的,线程窗口的窗口过程也被主线程执行。因此,FMethod字段所指定的方法就在主线程内执行。”
《C++Builder5开发人员指南》中同样有类似的描述:“Synchronize方法等待主VCL线程进入消息循环,然后执行传入的方法。”
TThread.Synchronize no longer uses a global window (ThreadWindow in D5's
classes.pas) to coordinate with the main VCL thread. Instead,
a TList, protected by a critical section, stores the events, and a new
procedure in classes.pas, called CheckSynchronize, must be called at
regular intervals to make Synchronize work. CheckSynchronize is
a function which returns TRUE if at least one TThread had an event in
the Synchronize queue when it was called.
使用synchronize是因为当你使用从VCL继承过来的对象时,他们的特性和方法并不能保证
是线程安全的,即,访问特性货方法也许会执行一些使用一些没有被其他线程保护的内存。
因此,为VCL对象的访问设了一个主VCL线程。这是处理应用程序中组件接收的所有的
Windows消息的线程。 如果所有对象是在同一个线程中访问特性和方法,就不必担心会发生
冲突。为了使用主VCL线程,产生一个分离的过程来执行需求的操作,在你的线程中使用
Synchronize方法来调用这个分离的过程。Synchronize等待主VCL线程进入消息循环,然后
执行相应的方法。
ThreadedEvent从字面的意思也能看到多线程的事件,拿来在多线程中的场合用的呗
 
多人接受答案了。
 
后退
顶部