問題タブ [datamodule]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - TTetheringManager を適切に削除するには?
Firemonkey アプリケーション間の通信を実現するためにアプリ テザリングを開始しようとしていますが、使用に問題があります。TDataModule
特に、 aを含む aの作成と削除がTTetheringManager
期待どおりに機能しないようです。
新しいクロスプラットフォームの Firemonkey アプリを作成し、DataModule を追加しました。コンパイラは bcc32c (CLANG C++11) です。DataModule にTTetheringManager
とTTetheringAppProfile
コンポーネントを配置し、 のプロパティManager
をTetheringAppProfile1
に設定しますTetheringManager1
。
DataModule のコンストラクタであるデストラクタで、次のことを行います。
メイン フォームにボタンを配置し、OnClick
イベントに次のコードを追加しました。
削除する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
発見プロセスを完全に終了していないようです。