0

Firemonkey アプリケーション間の通信を実現するためにアプリ テザリングを開始しようとしていますが、使用に問題があります。TDataModule特に、 aを含む aの作成と削除がTTetheringManager期待どおりに機能しないようです。

新しいクロスプラットフォームの Firemonkey アプリを作成し、DataModule を追加しました。コンパイラは bcc32c (CLANG C++11) です。DataModule にTTetheringManagerTTetheringAppProfileコンポーネントを配置し、 のプロパティManagerTetheringAppProfile1に設定します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 (Thread=:0293BA00)
:0040FF1A System::ThreadWrapper(Parameter=:02966B20)
:753e338a kernel32.BaseThreadInitThunk + 0x12
:776d9902 ntdll.RtlInitializeExceptionChain + 0x63
:776d98d5 ntdll.RtlInitializeExceptionChain + 0

作成と削除を 2 つの異なるボタン イベント ハンドラに分割すると、正常に動作しますが、これは必要なものではありません...

これを解決するために次のことを試みましたが、成功しませんでした。

  • OnEndManagersDiscovery呼び出し中にイベントを待ってApplication->ProcessMessages()から削除するDataModule
  • Sleep(0)削除する前に電話するDataModule
  • Sleep(0)のデストラクタを呼び出すDataModule
  • C++Builder のバグを除外するために、Delphi で同様のプロジェクトを作成しました。C++ アプリケーションと同じ動作。

私はこれに何時間も取り組んでいますが、なぜこれがうまくいかないのかわかりません...

編集

異なるボタンの OnClick ハンドラからコンストラクタとデストラクタを呼び出しても、常に機能するとは限りません。削除ボタンをクリックする速さによって異なります。

検出手順は別のスレッドで行われます。このスレッドの同期に問題があると思います。CancelDiscoverManagers発見プロセスを完全に終了していないようです。

4

0 に答える 0