2015-02-11 54 views
0

當我在ActiveXForm上使用TIdUDPServer時,Udp服務器的OnUDPRead事件不會觸發。
如果我檢查IdUDPServer.Active狀態,它是「true」。但爲什麼OnUDPRead從未觸發?ActiveX表單上的Udp服務器

回答

0

TIdUDPServer是一個多線程組件。其Bindings集合中的每個項目在其自己的工作線程中偵聽數據。

TIdUDPServer.ThreadedEvent屬性默認,這意味着每個Binding通過調用TThread.Synchronize(),這不一個DLL的內部工作,除非DLL和EXE與運行的軟件包編譯觸發主UI線程的上下文中OnUDPRead事件假啓用,因此他們共享RTL的共同副本。否則,DLL將擁有自己獨立的RTL副本,而不是主EXE的RTL(假設EXE完全使用VCL)。如果沒有啓用運行時軟件包,主EXE將不得不顯式調用DLL,以便將DLL的消息隊列抽取爲Synchronize()請求,因爲它們不會出現在EXE的消息隊列中(假設EXE甚至知道如何處理它們所做的那樣)。

如果設置ThreadedEvent爲true,Synchronize()將不會被使用,因此OnUDPRead活動將在每個Binding線程的上下文中觸發。你只需要確保你的OnUDPRead處理程序代碼被寫成線程安全的。

+0

感謝您的幫助。 相關[問題](http://stackoverflow.com/questions/7935870/delphi-thread-not-executing-in-activex-form-b​​ut-does-elsewhere)。也許它有助於某人... – SimaWB 2015-02-13 08:57:42