tcriticalsection.create访问冲突

Uma*_*med 2 delphi multithreading

我正在编写一个多线程聊天服务器应用程序.因此,关键部分是非常必要的.我刚刚为线程树视图创建了一个包装类.它在客户端完美运行,但服务器引发AV.

有两种形式,FormServer(除了gui绘画几乎没有任何处理)和DataModuleServer完成所有繁重的工作.

首先创建FormServer.

实际上,线程树视图位于另一个包装器类TRoomTree中.

TDataModuleServer.Create

procedure TDataModuleServer.cr(Sender: TObject);
begin
  Rooms := TRoomTree.Create (FormServer.tvRooms);
Run Code Online (Sandbox Code Playgroud)

tvRooms:视觉树视图

TRoomTree.Create

constructor TRoomTree.Create (TV : TTreeView);
begin

  if Assigned (TV) then
    fTreeView.Create (TV)
  else
    exit;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

Dav*_*nan 7

TRoomTree.Create,这行代码

fTreeView.Create(TV);
Run Code Online (Sandbox Code Playgroud)

对您的访问违规负责.那是因为fTreeView在您尝试调用方法之前尚未初始化.

Delphi实例的创建方式如下:

fTreeView := TThreadTreeView.Create(TV);
Run Code Online (Sandbox Code Playgroud)

我不确定你的线程模型,但我相信你知道只能从GUI线程访问VCL控件.

  • 呵呵 - 老'不是最好的<g>.'实际上,在XE3中,编译器已被更改为最后删除该功能!它只需要2个十年! (3认同)