如何正确删除TTetheringManager?

时间:2016-06-20 12:43:48

标签: delphi c++builder firemonkey datamodule

我正试图进入app tethering以实现Firemonkey应用程序之间的通信,但使用它时遇到一些问题。特别是创建和删除包含TDataModule的{​​{1}}似乎无法正常工作。

我创建了一个新的跨平台Firemonkey应用程序并添加了一个DataModule。编译器是bcc32c(CLANG C ++ 11)。在DataModule上,我添加了TTetheringManagerTTetheringManager组件,并将TTetheringAppProfile的属性Manager设置为TetheringAppProfile1

在构造函数中,DataModule的析构函数我执行以下操作:

TetheringManager1

在主窗体上我放置了一个Button,在__fastcall TDataModule1::TDataModule1(TComponent* Owner) : TDataModule(Owner) { TetheringManager1->DiscoverManagers(); } //--------------------------------------------------------------------------- __fastcall TDataModule1::~TDataModule1() { TetheringManager1->CancelDiscoverManagers(); } //--------------------------------------------------------------------------- 事件中添加了以下代码:

OnClick

有时删除TDataModule1* DataModule = new TDataModule1(NULL); delete DataModule; 导致DataModule中的指针无效操作似乎有一个线程被取消,试图释放一些内存:

  

:7702c54f KERNELBASE.RaiseException + 0x58
  :0040E151 System :: TObject :: FreeInstance(Self = ????)
  :0040E151 System :: TObject :: FreeInstance(Self = ????)
  :004D7F7C System :: Classes :: ThreadProc(Thread =:0293BA00)
  :0040FF1A System :: ThreadWrapper(参数=:02966B20)
  :753e338a kernel32.BaseThreadInitThunk + 0x12
  :776d9902 ntdll.RtlInitializeExceptionChain + 0x63
  :776d98d5 ntdll.RtlInitializeExceptionChain + 0x36

当我将创建和删除拆分为两个不同的按钮事件处理程序时,它工作正常,但这不是我需要的...

我尝试了以下方法来解决这个问题,但没有成功:

  • 在调用System.pas之前等待OnEndManagersDiscovery事件,然后再删除Application->ProcessMessages()
  • 在删除DataModule
  • 之前致电Sleep(0)
  • DataModule
  • 的析构函数中调用Sleep(0)
  • 使用Delphi创建类似项目以排除C ++ Builder错误。与C ++应用程序中的行为相同。

我现在已经工作了好几个小时但不知道为什么这不应该工作......

修改

从不同的按钮调用构造函数和析构函数OnClick处理程序也无法工作。这取决于点击删除按钮的速度。

发现过程是在一个单独的线程中完成的。我认为同步这个线程存在问题。 DataModule似乎并没有完全完成发现过程。

0 个答案:

没有答案