2012-09-26 59 views
1

我的應用程序中有異常裁剪,可能是stack overflowour of memory。它們出現在不同的地方,取決於系統何時有足夠的時間。換句話說,運行應用程序兩次不會導致在同一個地方出現相同的異常。Indy 10 TCP命令處理程序是異步的嗎?

我有一些導致數據庫訪問的定時器。 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到印碼

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

突然開關可有人請解釋一下嗎?由於

我首先想到的是印地被打斷AnyDac,也許是因爲它被稱爲Applciation.ProcessMessages或相似的,但我沒有看到在堆棧上...

但是,如果這樣做的話,它可以中斷「正常」的非定時器處理程序代碼嗎?

我確定我已經破解了,問題是我的TCP命令處理程序正在重用其他東西所使用的AnyDac組件......然後我看着我的代碼,看到沒有數據庫訪問命令處理程序或他們所調用的任何東西。

我很難過。我寫的內容甚至有意義嗎?任何人都可以提供建議嗎?

感謝提前1,000,000的任何幫助。

+2

您是否在某處使用Indy'AntiFreeze'組件? –

+0

+1是的,我正在使用防凍 – Mawg

+0

嘗試在'IdCommandHandlers'單元的堆棧跟蹤方法中設置一個斷點並查看它們是如何到達那裏的。 –

回答

1

Indy的命令處理程序由TIdCmdTCPServerTIdCmdTCPClient使用,它們都是多線程組件。命令處理程序在Indy在內部創建的工作線程中調用。命令處理程序無法中斷正在另一個線程中運行的操作。

+1

+1謝謝你,@RemyLebeau。但計時器事件可以嗎?你能解釋一下堆棧轉儲嗎?只是好奇 – Mawg

+0

「命令處理程序無法中斷正在另一個線程中運行的操作。」要明確,那也意味着主線程? I.E.他們的事件處理程序不會被調用,直到Application.ProcessMessages()完成的任何結果爲止。完全不搶先? – Mawg

+1

命令處理程序不是消息驅動的。主線程中的Application.ProcessMessages()對它們根本沒有影響,反之亦然。他們在不同的線程中運行。你顯示的調用堆棧沒有意義,命令處理程序不能像這樣將自己注入到另一個線程的堆棧中。即使你的'OnCommand'事件處理程序正在對主線程執行同步操作,這會受到'ProcessMessages()'的影響,你仍然不會看到這種調用堆棧發生。 –