使用C ++ Builder XE5。
我的主窗体有一个Indy阻塞套接字,只要应用程序启动并显示主窗体,我就想连接并阻塞它。
这样做的正确方法是什么?
在以前的版本或C ++ Builder中,OnCreate
和AfterConstruction
都不可靠。通常我将这样的代码放在主.cpp
文件中,就在Application->Run()
之前,但这不合适,因为我要阻止(并依赖TIdAntifreeze
进行消息处理)
我想到的一种方法是定义一个自定义的Windows消息并将其发布给我自己,但我想知道是否有一个"正确的"方式。
答案 0 :(得分:1)
我的主窗体有一个Indy阻塞套接字,只要应用程序启动并显示主窗体,我就想连接并阻塞它。
你真的需要在主UI线程中阻止I / O吗?阻塞操作,例如Indy的套接字I / O,应该在工作线程中完成。
如果主线程需要在仍然处理UI消息时阻塞套接字操作,则可以在CreateEvent()
中使用MsgWaitForMultipleObject()
在仅调用Application->ProcessMessages()
的循环中使用可等待的事件对象当有消息要处理时,在发出事件信号时打破循环。但这通常不是最好的选择。一个事件驱动的模型,工作者线程通知主线程的活动/结果,将是一个更好的选择。你真的不应该阻止任何主UI线程。
这样做的正确方法是什么?
我建议让MainForm构造函数创建一个工作线程,然后线程可以管理套接字操作并在需要时与主UI同步。
在以前的版本或C ++ Builder中,OnCreate和AfterConstruction都不可靠。
AfterConstruction()
是可靠的,而且一直都是。只有OnCreate
事件是不可靠的,不应该在C ++中使用而不是使用构造函数。
通常我把这样的代码放在主.cpp文件中,就在Application-> Run()之前,但这不合适,因为我要阻止(并依赖于TIdAntifreeze进行消息处理)。 / p>
你真的不应该依赖TIdAntiFreeze
,工作线程是更好的选择。
我想到的一种方法是定义自定义窗口消息并将其发布给自己
那会有效。我有时会使用这种技术。请注意,这是一个基于HWND
的解决方案,因此您需要确保在发布消息之后以及从消息队列中检索消息之前,不会销毁/重新创建发布到的HWND
。如果您使用MainForm HWND
,请在OnShow
事件中发布消息。更好的选择是使用AllocateHWnd()
为您的自定义消息创建专用的HWND
。