1

私のアプリケーションでは、またはのいずれかで例外が発生していstack overflowますour of memory。システムに十分な時間があったかどうかに応じて、さまざまな場所に表示されます。言い換えると、アプリを2回実行しても、同じ場所で同じ例外が発生することはありません。

データベースアクセスを引き起こすタイマーがいくつかあります。AnyDac d / bコンポーネントの担当者は、グローバルを再利用することはできませんTADConnectionが、各タイマーハンドラーで動的に割り当てる必要があると言っています。

ドーがあったと思っただけです!最新のスタックトレースを見た瞬間。

fMainForm.TMainForm.GetToolNumberFromContext($31846FB4)
fMainForm.TMainForm.Received_HEART_BEAT($249AEFD0)
IdCommandHandlers.TIdCommand.DoCommand
IdCommandHandlers.TIdCommandHandler.DoCommand(???,$31846FB4,'')
IdCommandHandlers.TIdCommandHandler.Check('HEART_BEAT',$31846FB4)
IdCommandHandlers.TIdCommandHandlers.HandleCommand($31846FB4,'HEART_BEAT') <===
uADDatSManager.TADDatSRow.SetBlobLength($7DA10FDC,0,$C18DDDC,10,0,1,False)
uADDatSManager.TADDatSRow.SetBlobData($7DA10FDC,0,$C18DDDC,10,False)
uADDatSManager.TADDatSRow.SetData(0,$C18DDDC,10)
uADPhysMySQL.TADPhysMySQLCommand.FetchRow($7D2F4F90,nil)
uADPhysMySQL.TADPhysMySQLCommand.InternalFetchRowSet($7D2F4F90,nil,50)
uADPhysManager.DoFetch(0,50,50,False)
uADPhysManager.TADPhysCommand.FetchBase($7D2F4F90,False)
uADPhysManager.TADPhysCommandAsyncFetch.Execute
uADStanAsync.TADStanAsyncExecutor.ExecuteOperation(False)
uADStanAsync.TADStanAsyncExecutor.Run
uADPhysManager.TADPhysCommand.ExecuteTask(TADPhysCommandAsyncFetch($7DA24FEC) as IADStanAsyncOperation,TADPhysCommandAsyncFetch($7DA24FF8) as IADStanAsyncHandler,True)
uADPhysManager.TADPhysCommand.Fetch($7D2F4F90,False,True)
uADCompClient.TADCustomCommand.Fetch($7D2F4F90,False,True)
uADCompClient.TADCustomTableAdapter.Fetch(False)
uADCompClient.TADAdaptedDataSet.DoFetch($7D2F4F90,False,fdDown)
uADCompDataSet.TADDataSet.InternalFetchRows(False,True,fdDown)
uADCompDataSet.TADDataSet.GetRecord($7DA1AFF4,gmNext,True)
Data.DB.TDataSet.GetNextRecord
Data.DB.TDataSet.GetNextRecords
Data.DB.TDataSet.SetBufferCount(???)
Data.DB.TDataSet.UpdateBufferCount
Data.DB.TDataSet.DoInternalOpen
Data.DB.TDataSet.OpenCursor(???)
uADCompDataSet.TADDataSet.OpenCursor(False)
uADCompClient.TADRdbmsDataSet.OpenCursor(False)
Data.DB.TDataSet.SetActive(???)
uADCompDataSet.TADDataSet.SetActive(True)
Data.DB.TDataSet.Open
uADCompClient.TADRdbmsDataSet.Open('SELECT * FROM tagged_chemicals',(...),(...))
uADCompClient.TADRdbmsDataSet.Open('SELECT * FROM tagged_chemicals')
fMainForm.TMainForm.CheckEndOfScheduleTimerTimer($B116FAC)
Vcl.ExtCtrls.TTimer.Timer
Vcl.ExtCtrls.TTimer.WndProc(???)
System.Classes.StdWndProc(133584,275,1,0)
:768a62fa ; C:\Windows\syswow64\USER32.dll
:768a6d3a USER32.GetThreadDesktop + 0xd7
:768a77c4 ; C:\Windows\syswow64\USER32.dll
:768a788a USER32.DispatchMessageW + 0xf
Vcl.Forms.TApplication.ProcessMessage(???)

そのマークされた行、AnyDacからIndyコードへの突然の切り替えがわかりません

IdCommandHandlers.TIdCommandHandlers.HandleCommand($31846FB4,'HEART_BEAT') <===
uADDatSManager.TADDatSRow.SetBlobLength($7DA10FDC,0,$C18DDDC,10,0,1,False)

誰か説明してもらえますか?ありがとう

私の最初の考えは、おそらくApplciation.ProcessMessagesなどを呼び出したために、IndyがAnyDacを中断しているということでしたが、スタックには表示されません...

しかし、それが可能であれば、「通常の」非タイマーハンドラーコードを中断できますか?

私はそれがクラックされていることを確信していました、そして問題は私のTCPコマンドハンドラーが他のものによって使用されるAnyDacコンポーネントを再利用していたことでした...それから私は私のコードを見て、コマンドハンドラーまたはでデータベースアクセスがないことを確認しました彼らが呼ぶものは何でも。

私は困惑しています。私が書いたことは意味がありますか?誰かアドバイスはありますか?

助けてくれてありがとう。

4

1 に答える 1

1

Indyのコマンドハンドラーは、TIdCmdTCPServerとによって使用されTIdCmdTCPClientます。これらは両方ともマルチスレッドコンポーネントです。コマンドハンドラーは、Indyが内部で作成するワーカースレッド内で呼び出されます。コマンドハンドラーが別のスレッドで実行されている操作を中断できる方法はありません。

于 2012-09-26T19:24:55.813 に答える