Yun*_*urk 0 c++ multithreading indy c++builder borland-c++
[我可能错了] TIdTCPServer Server在Borland C++构建器中是多线程的.它在单独的线程上处理所有客户端.这是在Borland c ++的帮助下编写的.
现在是我的问题和疑问.例如,ShowMessage(String ..)应该在main(gui)线程上调用方法.但正如我上面所说,TCPServer是多线程的,并处理OnExecute不同线程上的事件.当我在OnExecute事件中使用ShowMessage方法(在与主线程不同的线程上处理)时,我得到了奇怪的结果.有时ShowMessage()按预期工作,有时它显示没有任何文字与不同的盒子大小(无限长,非常长,正常等).其他用户界面更改没有问题(更新TEdit,TMemo.ShowMessage()现在只有问题)
我认为这个问题是调用ShowMessage()方法不是在主(gui)线程上而是在TCPServer的线程上的结果,该线程是由TIdTCPServer在内部为客户端连接创建的.那么我该如何解决呢?
ShowMessage()显示VCL TForm,因此不是线程安全的.你必须使用TThread::Synchronize(),TThread::Queue(),TIdSync,TIdNotify,或者您选择的任何其他线程间通信机制,使ShowMessage()运行在主线程上.
要在工作线程中显示弹出消息,请改用Win32 API MessageBox()函数.它是线程安全的,可以在任何线程中调用而不与主线程同步.