2013-12-19 26 views
0

[我可能对这些错误] TIdTCPServer服务器是Borland C++ builder中的多线程。它处理所有客户的独立线程。这是在Borland C++的帮助下编写的。Borland C++ - 多线程TCPServer问题

现在是我的问题&问题。例如,ShowMessage(String ..)方法应该在主(gui)线程上调用。但正如我上面所说的,TCPServer是多线程的,在不同线程上处理事件OnExecute。当我在OnExecute事件中使用ShowMessage方法(它在与主线程不同的线程上处理)时,我得到了奇怪的结果。有时候ShowMessage()按预期工作,有时在不同的箱子尺寸(无限长,非常长,正常等)上显示没有任何文字。其他用户界面的变化不会产生问题(更新TEDIT,TMemo。只有ShowMessage()有现在的问题)

我觉得这个问题是调用ShowMessage()方法不是在主(GUI)线程,但在TCPSERVER的线程是结果由TIdTCPServer在内部为客户端连接创建。 那么我该如何解决它?

+2

我一直在使用不同的架构来尝试实现相同的事情(wxWidget/boost :: asio),我也遇到了类似的问题。解决方案是将需要显示的数据传递给UI线程,然后在该线程中调用ShowMessage。我不确定这是否是正确的解决方案,我不知道如何用Bolrand做到这一点。 – Arthur

回答

3

用户界面的调整应在主线程来完成。您可以使用TThread::Queue函数在主线程中执行函数。它向主消息队列发布消息,并且当主线程处理消息时,作为参数传递的TThreadMethod得到执行。

如果您需要将数据传递到主线程,例如要显示的消息,您必须单独执行此操作,因为函数参数不能通过Queue函数传递。

+0

谢谢。 TThread ::队列工作。 –

0

是你的问题有最有可能无关,与TCP。任何VCL访问必须主线程中完成。 (不要忘记,消息对话框往往从VCL wrapers叫,而不是直接通过WINAPI)

赞成票我知道这招的确奏效“井”即使不是,但随后出现这样的问题:

  1. 总是例外的应用程序关闭/退出
  2. 偶尔应用程序挂起/异常(致命或非致命的应用程序)
  3. 偶尔损坏VCL视觉的东西(缺少列表中的项目,错过的事件等)
  4. 偶尔不可预知的行为(有时覆盖甚至App非VCL da TA)

许多偶然的问题是重复的依赖:

  • UI复杂
  • 源代码的复杂性(大码更经常的问题)
  • 数量的窗口/表格

也要小心内存泄漏。 VCL是不稳定的极端如果内存管理器由无效删除等损坏......(不知道关于它的新版本,但在BDS2006这是怎么很大的问题)

PS。如果你只需要对话框,然后使用WINAPI接口,它应该在的线程甚至工作,如果你的文本数据是不是VCL相关(例如AnsiString类型变量访问是好的,但DBGrid的访问不是)

+0

btw不要误会borland/embarcadero有很多问题,但是当你知道它们并且知道如何避免它们时,那​​么它对PC和其他任何我正在使用的(包括MSVC++)来说都是更好的开发环境。由于许多原因,BDS2006仍然是我的最佳选择。 – Spektre

5

ShowMessage()显示一个VCL TForm,因此不是线程安全的。您必须使用TThread::Synchronize(),TThread::Queue(),TIdSync,TIdNotify或您选择的任何其他线程间通信机制来使主线程上运行ShowMessage()

要在工作线程中显示弹出消息,请改用Win32 API MessageBox()函数。它是线程安全的,可以在任何线程中调用,而无需与主线程同步。