2013-01-14 33 views
1

我想在C++ Builder XE中構建DataSnap服務器作爲Windows窗體應用程序。我使用TIdSchedulerOfThreadPool,如http://blog.marcocantu.com/blog/datasnap_deployment_performance.html所述。在有負載下,我得到了大量的EIdConnClosedGracefully異常,這可能是正常的,但問題是我從線程中得到這些異常作爲MessageBoxes。我尋找一些事件,我可以壓制這個消息框。如何從DataSnap中的線程中抑制異常消息框EIdConnClosedGracefully

回答

0

您是否看到消息框僅在調試器中運行應用程序時出現,或者您在IDE外部運行應用程序時是否看到它們?在調試器內部是正常行爲,因爲它們是最後的例外。除非您告訴它忽略它們,否則調試器會針對引發的異常顯示彈出消息。但在IDE之外,從工作線程看消息框的唯一方法是,如果您自己的代碼捕獲異常並自己顯示消息框,或者DataSnap在內部顯示它們。 EIdConnClosedGracefully是一個Indy異常,並且DataSnap在內部使用Indy,但DataSnap很可能不會顯示它自己的消息框。 Indy當然不會顯示一個消息框。

+0

見上面我的回答:) – user1976837

+0

我添加bug報告http://qc.embarcadero.com/wc/qcmain.aspx?d=112154它在XE3中修復了http://qc.embarcadero.com/wc/qcmain.aspx?d=97194這是永無止境的故事。 XE3修復了一個問題並引入了新問題。 R.I.P DataSnap – user1976837

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 
+0

然後,它是'TWebRequestHandler :: HandleException()'中的一個錯誤,因爲它不應該在工作線程內調用'ShowException()'。請[提交錯誤報告](http://qc.embarcadero.com)到Embarcadero。 –