Windows 在析构函数中等待WorkerThread时崩溃
我对Virtual Treeview析构函数有一个问题,它会在WorkerThread仍在运行时停止它 代码: 以及ReleaseThreadReference的代码:Windows 在析构函数中等待WorkerThread时崩溃,windows,delphi,delphi-2009,virtualtreeview,Windows,Delphi,Delphi 2009,Virtualtreeview,我对Virtual Treeview析构函数有一个问题,它会在WorkerThread仍在运行时停止它 代码: 以及ReleaseThreadReference的代码: procedure ReleaseThreadReference(Tree: TBaseVirtualTree); begin if Assigned(WorkerThread) then begin Dec(WorkerThread.FRefCount); // Make sure there is
procedure ReleaseThreadReference(Tree: TBaseVirtualTree);
begin
if Assigned(WorkerThread) then
begin
Dec(WorkerThread.FRefCount);
// Make sure there is no reference remaining to the releasing tree.
Tree.InterruptValidation;
if WorkerThread.FRefCount = 0 then
begin
with WorkerThread do
begin
Terminate;
SetEvent(WorkEvent);
end;
FreeAndNil(WorkerThread);
CloseHandle(WorkEvent);
end;
end;
end;
WinDbg的输入和输出:
FAULTING_IP:
vcl120!Forms.TGlassFrame.FrameExtended+3
501f0b57 807b0800 cmp byte ptr [ebx+8],0
EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 501f0b57 (vcl120!Forms.TGlassFrame.FrameExtended+0x00000003)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 00000000
Parameter[1]: 00000008
Attempt to read from address 00000008
PROCESS_NAME: MyProcess.exe
ERROR_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s.
EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s.
EXCEPTION_PARAMETER1: 00000000
EXCEPTION_PARAMETER2: 00000008
READ_ADDRESS: 00000008
FOLLOWUP_IP:
vcl120!Forms.TGlassFrame.FrameExtended+0
501f0b54 53 push ebx
FAULTING_THREAD: 00000894
ADDITIONAL_DEBUG_TEXT: Followup set via attribute from Frame 0 on thread 894
BUGCHECK_STR: APPLICATION_FAULT_NULL_CLASS_PTR_DEREFERENCE_WINDOW_HOOK
PRIMARY_PROBLEM_CLASS: NULL_CLASS_PTR_DEREFERENCE
DEFAULT_BUCKET_ID: NULL_CLASS_PTR_DEREFERENCE
LAST_CONTROL_TRANSFER: from 501c565d to 501f0b57
00d7eca4 501c565d 00d7efb0 028408b9 00d7ee74 vcl120!Forms.TGlassFrame.FrameExtended+0x3
00d7edd0 501c9cec 00d7ee74 01a58e10 77c2c3ce vcl120!Controls.TControl.WndProc+0x2d5
00d7ee10 501e5a59 00d7efb0 028408b9 02190e80 vcl120!Controls.TWinControl.WndProc+0x518
00d7ee3c 501c9403 00d7ee50 50007cb0 00d7ee6c vcl120!Forms.TCustomForm.WndProc+0x599
00d7ee6c 500591de 00000046 00000000 00d7efb0 vcl120!Controls.TWinControl.MainWndProc+0x2f
00d7ee84 77d48709 002b00ee 00000046 00000000 rtl120!Classes.StdWndProc+0x16
00d7eeb0 77d4d297 028408b9 002b00ee 00000046 user32!InternalCallWinProc+0x28
00d7ef18 77d4b368 00000000 028408b9 002b00ee user32!UserCallWinProcCheckWow+0xea
00d7ef6c 77d4d1da 01c9c880 00000046 00000000 user32!DispatchClientMessage+0xa3
00d7ef94 7c90eae3 00d7efa4 00000030 01c9c880 user32!__fnINOUTLPWINDOWPOS+0x27
00d7efac 002b00ee 00000000 00000000 00000000 ntdll!KiUserCallbackDispatcher+0x13
00d7efe8 501e6a2b 002b00ee 00000000 00d7f1cc MainControls!TUJournalIntf.ImportFunFile+0x33a
00d7f020 501e88cc 02190e80 00d7f158 501c565d vcl120!Forms.TCustomForm.SetMenu+0x197
00d7f02c 501c565d 00d7f35c 028408b9 00d7f1fc vcl120!Forms.TCustomForm.WMNCCreate+0x20
00d7f158 501c9cec 00d7f1fc 00d7f1a4 501c9cec vcl120!Controls.TControl.WndProc+0x2d5
00d7f198 501e5a59 00d7f35c 028408b9 02190e80 vcl120!Controls.TWinControl.WndProc+0x518
00d7f1c4 501c9403 00d7f1d8 501c941b 00d7f1f4 vcl120!Forms.TCustomForm.WndProc+0x599
00d7f1f4 500591de 00000081 00000000 00d7f35c vcl120!Controls.TWinControl.MainWndProc+0x2f
00d7f20c 77d48709 002b00ee 00000081 00000000 rtl120!Classes.StdWndProc+0x16
00d7f238 77d4d297 028408b9 002b00ee 00000081 user32!InternalCallWinProc+0x28
00d7f2a0 77d4b368 00000000 028408b9 002b00ee user32!UserCallWinProcCheckWow+0xea
00d7f2f4 77d4e840 01c9c880 00000081 00000000 user32!DispatchClientMessage+0xa3
00d7f324 7c90eae3 00d7f334 00000060 00000060 user32!__fnINLPCREATESTRUCT+0x8b
00d7f390 77d517eb 77d517b1 00050000 00d7f8b8 ntdll!KiUserCallbackDispatcher+0x13
00d7f834 77d518a4 00050000 00d7f8b8 00d7f8cc user32!NtUserCreateWindowEx+0xc
00d7f8e0 77d51b08 00050000 00d7fa04 00d7f8cc user32!_CreateWindowEx+0x1ed
00d7f91c 50122dd0 00050000 00d7fa04 0b3413bc user32!CreateWindowExW+0x33
00d7f964 501c8b29 00000000 50120000 00000000 vcl120!Windows.CreateWindowEx+0x44
00d7faa8 501c8a47 00d7fc80 501c8ae7 00d7fbc4 vcl120!Controls.TWinControl.CreateWindowHandle+0x35
00d7fbc4 501e3682 02190e80 501e7787 00d7f9cc vcl120!Controls.TWinControl.CreateWnd+0x13f
00d7fc18 77d4d86f 000100a8 00d7fc68 00d7fcf8 vcl120!Forms.TScrollingWinControl.CreateWnd+0xa
00d7fc38 77d4d94b 00000000 00000000 501ed470 user32!InternalEnumWindows+0x5a
00d7fc58 501ed556 501ed470 00d7fc68 00450242 user32!EnumWindows+0x16
00d7fce0 500591de 0000001c 00000000 00000454 vcl120!Forms.TApplication.DoNormalizeTopMosts+0x32
00d7fcf8 77d48709 00450242 0000001c 00000000 rtl120!Classes.StdWndProc+0x16
00d7fd24 77d487eb 02840fe2 00450242 0000001c user32!InternalCallWinProc+0x28
00d7fd8c 77d4b368 00000000 02840fe2 00450242 user32!UserCallWinProcCheckWow+0x150
00d7fde0 77d4b3b4 01c8f058 0000001c 00000000 user32!DispatchClientMessage+0xa3
00d7fe08 7c90eae3 00d7fe18 00000018 01c8f058 user32!__fnDWORD+0x24
00d7fe2c 77d493c6 77d49385 00d7feac 00000000 ntdll!KiUserCallbackDispatcher+0x13
00d7fe58 77d493df 00d7feac 00000000 00000000 user32!NtUserPeekMessage+0xc
00d7fe84 500576a4 00d7feac 00000000 00000000 user32!PeekMessageW+0xbc
00d7fee8 50006c37 5002b6a9 01783c94 00d7ff08 rtl120!Classes.TThread.WaitFor+0x5c
00d7fef8 0178fc99 00000003 021d5800 021d5830 rtl120!System.TObject.Free+0xb
00d7ff08 501c7240 02190e80 021d5830 021d5830 VirtualTreesR!VirtualTrees.TBaseVirtualTree.Destroy+0x21
00d7ff1c 501cef46 00000002 00000000 501c7240 vcl120!Controls.TWinControl.Destroy+0x90
00d7ff28 501c7240 00d7ff64 02190e80 02190e80 vcl120!Controls.TCustomControl.Destroy+0x22
00000000 00000000 00000000 00000000 00000000 vcl120!Controls.TWinControl.Destroy+0x90
SYMBOL_NAME: vcl120!Forms.TGlassFrame.FrameExtended+0
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: vcl120
IMAGE_NAME: vcl120.bpl
DEBUG_FLR_IMAGE_TIMESTAMP: 4a0b8b7f
STACK_COMMAND: .ecxr ; ~~[894] ; .frame 0 ; ~0s; .ecxr ; kb
FAILURE_BUCKET_ID: NULL_CLASS_PTR_DEREFERENCE_c0000005_vcl120.bpl!Forms.TGlassFrame.FrameExtended
BUCKET_ID: APPLICATION_FAULT_NULL_CLASS_PTR_DEREFERENCE_WINDOW_HOOK_vcl120!Forms.TGlassFrame.FrameExtended+0
如果您查看callstack“0000001C00000000RTL120!Classes.StdWndProc+0x16”中的这一行,您可以看到应用程序处理WM_ACTIVATEAPP(0x1C)消息并调用“DoNormalizeTopMosts”(我认为这将导致再次创建主窗体)。我在我们的项目DevExpress6中发现了“dxBarWndProcHook”,也许这是个问题,但我不确定。我不知道为什么会发生这种情况-函数TThread.WaitFor processed message导致重新创建表单
拜托,谁能帮我解决这个问题?提前谢谢你 你确定例外情况来自那里吗?您能提供一个SSCCE吗?问题肯定在您的代码中,您并没有显示。谢谢您的回答。这个项目很大,我不能发布所有的源代码。。类型为“TVirtualStringTree”的MyVT是设计组件,在FormDestroy中称为MyVT.Clear()。在等待WorkerThread停止(WorkerThread是虚拟树视图组件的全局)时,问题似乎出现在MyVT的析构函数(TBaseVirtualTree.Destroy)中。请告诉我调用FreeAndNil(WorkerThread)可以吗?这会导致TBaseVirtualTree的析构函数中出现WorkerThread.WaitFor??请解释一下PeekMessageW+0xbc(底部第7行)中的调用堆栈好吗?非常感谢。您一直在使用哪个版本的VirtualTreeView?为什么要调用MyVT.Clear()?当然,这棵树在被摧毁之前会被清除。您如何确切地知道异常来自此代码?您好,我99%确定,这是Delphi中的一个bug。。你可以看看这里:还有这里:
FAULTING_IP:
vcl120!Forms.TGlassFrame.FrameExtended+3
501f0b57 807b0800 cmp byte ptr [ebx+8],0
EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 501f0b57 (vcl120!Forms.TGlassFrame.FrameExtended+0x00000003)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 00000000
Parameter[1]: 00000008
Attempt to read from address 00000008
PROCESS_NAME: MyProcess.exe
ERROR_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s.
EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s.
EXCEPTION_PARAMETER1: 00000000
EXCEPTION_PARAMETER2: 00000008
READ_ADDRESS: 00000008
FOLLOWUP_IP:
vcl120!Forms.TGlassFrame.FrameExtended+0
501f0b54 53 push ebx
FAULTING_THREAD: 00000894
ADDITIONAL_DEBUG_TEXT: Followup set via attribute from Frame 0 on thread 894
BUGCHECK_STR: APPLICATION_FAULT_NULL_CLASS_PTR_DEREFERENCE_WINDOW_HOOK
PRIMARY_PROBLEM_CLASS: NULL_CLASS_PTR_DEREFERENCE
DEFAULT_BUCKET_ID: NULL_CLASS_PTR_DEREFERENCE
LAST_CONTROL_TRANSFER: from 501c565d to 501f0b57
00d7eca4 501c565d 00d7efb0 028408b9 00d7ee74 vcl120!Forms.TGlassFrame.FrameExtended+0x3
00d7edd0 501c9cec 00d7ee74 01a58e10 77c2c3ce vcl120!Controls.TControl.WndProc+0x2d5
00d7ee10 501e5a59 00d7efb0 028408b9 02190e80 vcl120!Controls.TWinControl.WndProc+0x518
00d7ee3c 501c9403 00d7ee50 50007cb0 00d7ee6c vcl120!Forms.TCustomForm.WndProc+0x599
00d7ee6c 500591de 00000046 00000000 00d7efb0 vcl120!Controls.TWinControl.MainWndProc+0x2f
00d7ee84 77d48709 002b00ee 00000046 00000000 rtl120!Classes.StdWndProc+0x16
00d7eeb0 77d4d297 028408b9 002b00ee 00000046 user32!InternalCallWinProc+0x28
00d7ef18 77d4b368 00000000 028408b9 002b00ee user32!UserCallWinProcCheckWow+0xea
00d7ef6c 77d4d1da 01c9c880 00000046 00000000 user32!DispatchClientMessage+0xa3
00d7ef94 7c90eae3 00d7efa4 00000030 01c9c880 user32!__fnINOUTLPWINDOWPOS+0x27
00d7efac 002b00ee 00000000 00000000 00000000 ntdll!KiUserCallbackDispatcher+0x13
00d7efe8 501e6a2b 002b00ee 00000000 00d7f1cc MainControls!TUJournalIntf.ImportFunFile+0x33a
00d7f020 501e88cc 02190e80 00d7f158 501c565d vcl120!Forms.TCustomForm.SetMenu+0x197
00d7f02c 501c565d 00d7f35c 028408b9 00d7f1fc vcl120!Forms.TCustomForm.WMNCCreate+0x20
00d7f158 501c9cec 00d7f1fc 00d7f1a4 501c9cec vcl120!Controls.TControl.WndProc+0x2d5
00d7f198 501e5a59 00d7f35c 028408b9 02190e80 vcl120!Controls.TWinControl.WndProc+0x518
00d7f1c4 501c9403 00d7f1d8 501c941b 00d7f1f4 vcl120!Forms.TCustomForm.WndProc+0x599
00d7f1f4 500591de 00000081 00000000 00d7f35c vcl120!Controls.TWinControl.MainWndProc+0x2f
00d7f20c 77d48709 002b00ee 00000081 00000000 rtl120!Classes.StdWndProc+0x16
00d7f238 77d4d297 028408b9 002b00ee 00000081 user32!InternalCallWinProc+0x28
00d7f2a0 77d4b368 00000000 028408b9 002b00ee user32!UserCallWinProcCheckWow+0xea
00d7f2f4 77d4e840 01c9c880 00000081 00000000 user32!DispatchClientMessage+0xa3
00d7f324 7c90eae3 00d7f334 00000060 00000060 user32!__fnINLPCREATESTRUCT+0x8b
00d7f390 77d517eb 77d517b1 00050000 00d7f8b8 ntdll!KiUserCallbackDispatcher+0x13
00d7f834 77d518a4 00050000 00d7f8b8 00d7f8cc user32!NtUserCreateWindowEx+0xc
00d7f8e0 77d51b08 00050000 00d7fa04 00d7f8cc user32!_CreateWindowEx+0x1ed
00d7f91c 50122dd0 00050000 00d7fa04 0b3413bc user32!CreateWindowExW+0x33
00d7f964 501c8b29 00000000 50120000 00000000 vcl120!Windows.CreateWindowEx+0x44
00d7faa8 501c8a47 00d7fc80 501c8ae7 00d7fbc4 vcl120!Controls.TWinControl.CreateWindowHandle+0x35
00d7fbc4 501e3682 02190e80 501e7787 00d7f9cc vcl120!Controls.TWinControl.CreateWnd+0x13f
00d7fc18 77d4d86f 000100a8 00d7fc68 00d7fcf8 vcl120!Forms.TScrollingWinControl.CreateWnd+0xa
00d7fc38 77d4d94b 00000000 00000000 501ed470 user32!InternalEnumWindows+0x5a
00d7fc58 501ed556 501ed470 00d7fc68 00450242 user32!EnumWindows+0x16
00d7fce0 500591de 0000001c 00000000 00000454 vcl120!Forms.TApplication.DoNormalizeTopMosts+0x32
00d7fcf8 77d48709 00450242 0000001c 00000000 rtl120!Classes.StdWndProc+0x16
00d7fd24 77d487eb 02840fe2 00450242 0000001c user32!InternalCallWinProc+0x28
00d7fd8c 77d4b368 00000000 02840fe2 00450242 user32!UserCallWinProcCheckWow+0x150
00d7fde0 77d4b3b4 01c8f058 0000001c 00000000 user32!DispatchClientMessage+0xa3
00d7fe08 7c90eae3 00d7fe18 00000018 01c8f058 user32!__fnDWORD+0x24
00d7fe2c 77d493c6 77d49385 00d7feac 00000000 ntdll!KiUserCallbackDispatcher+0x13
00d7fe58 77d493df 00d7feac 00000000 00000000 user32!NtUserPeekMessage+0xc
00d7fe84 500576a4 00d7feac 00000000 00000000 user32!PeekMessageW+0xbc
00d7fee8 50006c37 5002b6a9 01783c94 00d7ff08 rtl120!Classes.TThread.WaitFor+0x5c
00d7fef8 0178fc99 00000003 021d5800 021d5830 rtl120!System.TObject.Free+0xb
00d7ff08 501c7240 02190e80 021d5830 021d5830 VirtualTreesR!VirtualTrees.TBaseVirtualTree.Destroy+0x21
00d7ff1c 501cef46 00000002 00000000 501c7240 vcl120!Controls.TWinControl.Destroy+0x90
00d7ff28 501c7240 00d7ff64 02190e80 02190e80 vcl120!Controls.TCustomControl.Destroy+0x22
00000000 00000000 00000000 00000000 00000000 vcl120!Controls.TWinControl.Destroy+0x90
SYMBOL_NAME: vcl120!Forms.TGlassFrame.FrameExtended+0
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: vcl120
IMAGE_NAME: vcl120.bpl
DEBUG_FLR_IMAGE_TIMESTAMP: 4a0b8b7f
STACK_COMMAND: .ecxr ; ~~[894] ; .frame 0 ; ~0s; .ecxr ; kb
FAILURE_BUCKET_ID: NULL_CLASS_PTR_DEREFERENCE_c0000005_vcl120.bpl!Forms.TGlassFrame.FrameExtended
BUCKET_ID: APPLICATION_FAULT_NULL_CLASS_PTR_DEREFERENCE_WINDOW_HOOK_vcl120!Forms.TGlassFrame.FrameExtended+0