我正在尝试进入应用程序共享以实现 Firemonkey 应用程序之间的通信,但在使用它时遇到了一些问题。特别是创建和删除TDataModule
包含 a 的 aTTetheringManager
似乎不像我预期的那样工作。
我创建了一个新的跨平台 Firemonkey 应用程序并添加了一个 DataModule。编译器是 bcc32c (CLANG C++11)。在 DataModule 上,我放置了一个TTetheringManager
和一个TTetheringAppProfile
组件并将属性设置Manager
为TetheringAppProfile1
to TetheringManager1
。
在 DataModule 的构造函数的析构函数中,我执行以下操作:
__fastcall TDataModule1::TDataModule1(TComponent* Owner)
: TDataModule(Owner)
{
TetheringManager1->DiscoverManagers();
}
//---------------------------------------------------------------------------
__fastcall TDataModule1::~TDataModule1()
{
TetheringManager1->CancelDiscoverManagers();
}
//---------------------------------------------------------------------------
在主窗体上,我放置了一个按钮,并在OnClick
事件中添加了以下代码:
TDataModule1* DataModule = new TDataModule1(NULL);
delete DataModule;
有时删除DataModule
会导致无效的指针操作System.pas
似乎有一个线程被取消,它试图释放一些内存:
:7702c54f KERNELBASE.RaiseException + 0x58
:0040E151 System::TObject::FreeInstance(Self=????)
:0040E151 System::TObject::FreeInstance(Self=????)
:004D7F7C System::Classes::ThreadProc (线程=:0293BA00)
:0040FF1A系统::ThreadWrapper(参数=:02966B20)
:753e338a kernel32.BaseThreadInitThunk + 0x12
:776d9902 ntdll.RtlInitializeExceptionChain + 0x63
:776d98d5 ntdll.RtlInitializeExceptionChain + 03
当我将创建和删除拆分为两个不同的按钮事件处理程序时,它工作正常,但这不是我需要的......
我尝试了以下方法来解决这个问题,但没有成功:
- 在删除之前等待
OnEndManagersDiscovery
事件同时调用Application->ProcessMessages()
DataModule
Sleep(0)
删除前调用DataModule
- 调用
Sleep(0)
析构函数DataModule
- 使用 Delphi 创建了类似的项目以排除 C++Builder 错误。与 C++ 应用程序中的行为相同。
我现在已经为此工作了好几个小时,但不知道为什么这不应该工作......
编辑
从不同的按钮 OnClick 处理程序调用构造函数和析构函数也并非总是有效。这取决于单击删除按钮的速度。
发现过程在单独的线程中完成。我认为同步这个线程有问题。CancelDiscoverManagers
似乎并没有完全完成发现过程。