C ++ Builder - 在应用程序启动时采取措施的正确方法

时间:2015-04-13 01:04:44

标签: c++builder indy vcl c++builder-xe5

使用C ++ Builder XE5。

我的主窗体有一个Indy阻塞套接字,只要应用程序启动并显示主窗体,我就想连接并阻塞它。

这样做的正确方法是什么?

在以前的版本或C ++ Builder中,OnCreateAfterConstruction都不可靠。通常我将这样的代码放在主.cpp文件中,就在Application->Run()之前,但这不合适,因为我要阻止(并依赖TIdAntifreeze进行消息处理)

我想到的一种方法是定义一个自定义的Windows消息并将其发布给我自己,但我想知道是否有一个"正确的"方式。

1 个答案:

答案 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