0

我正在尝试进入应用程序共享以实现 Firemonkey 应用程序之间的通信,但在使用它时遇到了一些问题。特别是创建和删除TDataModule包含 a 的 aTTetheringManager似乎不像我预期的那样工作。

我创建了一个新的跨平台 Firemonkey 应用程序并添加了一个 DataModule。编译器是 bcc32c (CLANG C++11)。在 DataModule 上,我放置了一个TTetheringManager和一个TTetheringAppProfile组件并将属性设置ManagerTetheringAppProfile1to 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似乎并没有完全完成发现过程。

4

0 回答 0