gpt4 book ai didi

multithreading - tcriticalsection.create 的访问冲突

转载 作者:行者123 更新时间:2023-12-03 18:16:32 25 4
gpt4 key购买 nike

我正在编写一个多线程聊天服务器应用程序。因此临界区是非常必要的。我刚刚为线程 TreeView 制作了一个包装类。它在客户端中完美运行,但服务器会引发 AV。

有两种形式,FormServer(除了 gui 绘制外几乎不做任何处理)和 DataModuleServer 完成所有繁重的工作。

首先创建 FormServer。

实际上线程 TreeView 在另一个包装类 TRoomTree 中。

TDataModuleServer.Create

procedure TDataModuleServer.cr(Sender: TObject);
begin
Rooms := TRoomTree.Create (FormServer.tvRooms);

tvRooms:可视 TreeView

TRoomTree.Create

constructor TRoomTree.Create (TV : TTreeView);
begin

if Assigned (TV) then
fTreeView.Create (TV)
else
exit;

fTreeView :线程 TreeView ;

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 : 普通 TreeView ;

现在 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

任何帮助将不胜感激。

最佳答案

TRoomTree.Create中,这行代码

fTreeView.Create(TV);

对您的访问违规负责。那是因为 fTreeView 在你试图调用它的方法之前还没有被初始化。

Delphi 实例是这样创建的:

fTreeView := TThreadTreeView.Create(TV);

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

关于multithreading - tcriticalsection.create 的访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13085188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com