我正试图进入app tethering以实现Firemonkey应用程序之间的通信,但使用它时遇到一些问题。特别是创建和删除包含TDataModule
的{{1}}似乎无法正常工作。
我创建了一个新的跨平台Firemonkey应用程序并添加了一个DataModule。编译器是bcc32c(CLANG C ++ 11)。在DataModule上,我添加了TTetheringManager
和TTetheringManager
组件,并将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)
我现在已经工作了好几个小时但不知道为什么这不应该工作......
修改
从不同的按钮调用构造函数和析构函数OnClick处理程序也无法工作。这取决于点击删除按钮的速度。
发现过程是在一个单独的线程中完成的。我认为同步这个线程存在问题。 DataModule
似乎并没有完全完成发现过程。