我正在编写一个多线程聊天服务器应用程序。因此,关键部分是非常必要的。我刚刚为线程树视图创建了一个包装类。它在客户端完美运行,但服务器引发AV。
有两种形式,FormServer(几乎没有任何处理,除了gui绘画)和DataModuleServer,它完成所有繁重的工作。
首先创建FormServer。
实际上,线程树视图位于另一个包装类TRoomTree中。
TDataModuleServer.Create
procedure TDataModuleServer.cr(Sender: TObject);
begin
Rooms := TRoomTree.Create (FormServer.tvRooms);
tvRooms:视觉树视图
TRoomTree.Create
constructor TRoomTree.Create (TV : TTreeView);
begin
if Assigned (TV) then
fTreeView.Create (TV)
else
exit;
fTreeView:线程树视图;
TThreadTreeView.Create
constructor TThreadTreeView.Create (TreeView : TTreeView = nil);
begin
fLock := TCriticalSection.Create;
if Assigned (TreeView) then
fTreeView := TreeView
else
fTreeView := TTreeView.Create (nil);
end;
fTreeView:普通树视图;
现在,TCriticalSection.Create在ntdll.dll中引发了一个AV异常。
调用堆栈
:76cac41f KERNELBASE.RaiseException + 0x58
:0040469c NotifyNonDelphiException + $1C
:77ecb42b ; ntdll.dll
uThreadTreeView.TThreadTreeView.Create($26B4300)
uRoomTree.TRoomTree.Create($26B4300)
uServer.TDataModuleServer.cr($26A48B0)
Classes.TDataModule.DoCreate
Classes.TDataModule.AfterConstruction
System.@AfterConstruction($26A48B0)
Classes.TDataModule.Create(???)
Forms.TApplication.CreateForm(???,(no value))
PlayburnServer.PlayburnServer
:773833aa kernel32.BaseThreadInitThunk + 0x12
:77ea9ef2 ntdll.RtlInitializeExceptionChain + 0x63
:77ea9ec5 ntdll.RtlInitializeExceptionChain + 0x36
非常感谢任何帮助。
答案 0 :(得分:7)
在TRoomTree.Create
中,这行代码
fTreeView.Create(TV);
负责您的访问违规行为。这是因为fTreeView
在尝试调用方法之前尚未初始化。
Delphi实例的创建方式如下:
fTreeView := TThreadTreeView.Create(TV);
我不确定您的线程模型,但我相信您知道只能从GUI线程访问VCL控件。