如何从DataSnap中的线程中抑制异常消息框EIdConnClosedGracefully

时间:2013-01-14 09:35:25

标签: c++builder indy datasnap

我正在尝试将C ++ Builder XE中的DataSnap服务器构建为Windows窗体应用程序。我使用TIdSchedulerOfThreadPool,如http://blog.marcocantu.com/blog/datasnap_deployment_performance.html所述。在有负载的情况下,我得到了很多EIdConnClosedGracefully异常,这可能是正常的,但问题是我从线程中得到了这个例外的MessageBoxes。我找了一些可以抑制这个消息框的事件。

2 个答案:

答案 0 :(得分:0)

您是否看到仅在调试器内部运行应用程序时才显示消息框,或者您是否在IDE外部运行应用程序时看到它们?调试器内部是正常行为,因为它们是异常的例外。调试器显示引发异常的弹出消息,除非您告诉它忽略它们。但是在IDE之外,您可以从工作线程看到消息框的唯一方法是,您自己的代码是否捕获异常并自己显示消息框,否则DataSnap会在内部显示它们。 EIdConnClosedGracefully是一个Indy异常,DataSnap在内部使用Indy,但DataSnap不太可能显示自己的消息框。 Indy肯定不会显示消息框。

答案 1 :(得分:0)

我也在IDE外面看到了消息框。它来自TWebRequestHandler(DataSnap)。以下是显示该消息框的线程的堆栈跟踪:

:7c90e514 ntdll.KiFastSystemCallRet
:7e369418 user32.WaitMessage + 0xc
:7e3749c4 ; C:\WINDOWS\system32\user32.dll
:7e38a956 ; C:\WINDOWS\system32\user32.dll
:7e38a2bc ; C:\WINDOWS\system32\user32.dll
:7e3b63fd user32.MessageBoxTimeoutW + 0x7a
:7e3a0853 user32.MessageBoxExW + 0x1b
:7e3b6579 user32.MessageBoxW + 0x45
:004D6BBD Sysutils::ShowException(ExceptObject=????, ExceptAddr=????)
:0082b248 ; Webreq::TWebRequestHandler::HandleException
:0082b06f ; Webreq::TWebRequestHandler::HandleRequest
:0043dbdf ; Idhttpwebbrokerbridge::_16464
:0043dd23 Idhttpwebbrokerbridge::TIdHTTPWebBrokerBridge::DoCommandGet + 0x23
:0068AB4D Idcustomhttpserver::TIdCustomHTTPServer::DoExecute(Self=:00E9B9D0, AContext=:00F13660)
:0063F09A Idcontext::TIdContext::Run(Self=????)
:0049F9CD Classes::ThreadProc(Thread=:00ECA260)
:004EF72E System::ThreadWrapper(Parameter=:00F1EF10)
:7c80b729 ; C:\WINDOWS\system32\kernel32.dll