Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi Indy 10 TCP命令处理程序是否异步?_Delphi_Indy10_Anydac - Fatal编程技术网

Delphi Indy 10 TCP命令处理程序是否异步?

Delphi Indy 10 TCP命令处理程序是否异步?,delphi,indy10,anydac,Delphi,Indy10,Anydac,我的应用程序中出现了异常,要么堆栈溢出,要么内存不足。它们出现在不同的地方,这取决于系统什么时候已经足够了。换句话说,在同一个地方运行两次应用程序不会导致相同的异常 我有一些导致数据库访问的计时器。AnyDac d/b组件的家伙告诉我,我不能重用全局TADConnection,但必须在每个计时器处理程序中动态分配它,我已经这样做了 我只是觉得我有一个d'oh!当我看到最新的堆栈跟踪时 fMainForm.TMainForm.GetToolNumberFromContext($31846FB4)

我的应用程序中出现了异常,要么
堆栈溢出
,要么
内存不足
。它们出现在不同的地方,这取决于系统什么时候已经足够了。换句话说,在同一个地方运行两次应用程序不会导致相同的异常

我有一些导致数据库访问的计时器。AnyDac d/b组件的家伙告诉我,我不能重用全局
TADConnection
,但必须在每个计时器处理程序中动态分配它,我已经这样做了

我只是觉得我有一个d'oh!当我看到最新的堆栈跟踪时

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(???)
fMainForm.TMainForm.GetToolNumberFromContext($31846FB4)
fMainForm.TMainForm.Received\u HEART\u BEAT(249AEFD0美元)
IdCommandHandlers.TIdCommand.DoCommand
IDCommandHandler.TIdCommandHandler.docomand(???,$31846FB4',)
IdCommandHandlers.TIdCommandHandler.Check('心跳',31846FB4美元)


IdCommandHandlers.TIdCommandHandlers.HandleCommand($31846FB4,'HEART_-BEAT')Indy的命令处理程序由
TIdCmdTCPServer
TIdCmdTCPClient
使用,它们都是多线程组件。命令处理程序在Indy内部创建的工作线程内部调用。命令处理程序无法中断在不同线程中运行的操作。

Indy的命令处理程序由
TIdCmdTCPServer
TIdCmdTCPClient
使用,这两个组件都是多线程组件。命令处理程序在Indy内部创建的工作线程内部调用。命令处理程序无法中断在不同线程中运行的操作。

您是否在某处使用Indy
防冻剂组件?+1是,我正在使用防冻剂在
IdCommandHandlers
单元的stacktrace方法中设置断点,并查看它们是如何到达的。您是否在某处使用Indy
防冻剂
组件?+1是,我正在使用防冻剂在
IdCommandHandlers
单元的stacktrace方法中设置一个断点,看看它们是如何到达那里的。+1谢谢你,@RemyLebeau。但计时器事件可以吗?你能解释一下堆栈转储吗?奇怪的是,“命令处理程序无法中断在不同线程中运行的操作。”很清楚,这也意味着主线程?也就是说,它们的事件处理程序在作为Application.ProcessMessages()的Resultlt运行的任何事件完成之前都不会被调用?完全非抢占式?命令处理程序不是消息驱动的<主线程中的code>Application.ProcessMessages()
对它们没有任何影响,反之亦然。它们在不同的线程中运行。您显示的调用堆栈没有意义,命令处理程序不能像那样将自己注入到另一个线程的堆栈中。即使您的
OnCommand
事件处理程序正在执行与主线程的同步操作,这可能会受到
ProcessMessages()
的影响,您仍然不会看到出现这种调用堆栈。+1@RemyLebeau,谢谢。总之“TCP命令处理程序不能中断任何其他内容,也不能与任何其他内容(包括计时器到期句柄)同时运行”是吗?没错,是的。计时器也将运行在不同于命令处理程序的线程中。+1谢谢你,@RemyLebeau。但计时器事件可以吗?你能解释一下堆栈转储吗?奇怪的是,“命令处理程序无法中断在不同线程中运行的操作。”很清楚,这也意味着主线程?也就是说,它们的事件处理程序在作为Application.ProcessMessages()的Resultlt运行的任何事件完成之前都不会被调用?完全非抢占式?命令处理程序不是消息驱动的<主线程中的code>Application.ProcessMessages()
对它们没有任何影响,反之亦然。它们在不同的线程中运行。您显示的调用堆栈没有意义,命令处理程序不能像那样将自己注入到另一个线程的堆栈中。即使您的
OnCommand
事件处理程序正在执行与主线程的同步操作,这可能会受到
ProcessMessages()
的影响,您仍然不会看到出现这种调用堆栈。+1@RemyLebeau,谢谢。总之,“TCP命令处理程序不能中断任何其他操作,也不能与任何其他操作同时运行,包括计时器到期句柄?-对?没错,是的。计时器也将在不同于命令处理程序的线程中运行。
IdCommandHandlers.TIdCommandHandlers.HandleCommand($31846FB4,'HEART_BEAT') <===
uADDatSManager.TADDatSRow.SetBlobLength($7DA10FDC,0,$C18DDDC,10,0,1,False)