シンプルな FMX マルチデバイス C++ アプリがあります。アプリには 1 つのフォームがあり、他には何もありません。Form のOnShow
イベントで、名前を付けた関数を開始しますStartupCode()
。すべてのコードを以下に示します。
Windowsでアプリを実行すると、予想どおりの動作が得られます。3 つのメッセージが正しいタイミングで正しい順序でポップアップします (たとえばSleep()
、前のダイアログ ボックスが [OK] をクリックして確認された後にのみ開始されます)。
iOSまたはAndroidでアプリを実行すると、最初に最後のメッセージ ポップアップが表示されますが ("Slept 2 sec")、時間全体が経過した後 (12.25 秒) にのみ表示されます。次に、[OK] をクリックして確認した直後に、「Slept 10 sec」というメッセージが表示され、その後も同様に「Slept Quarter sec」というメッセージが表示されます。
#include <System.SysUtils.hpp>
void StartupCode()
{
Sleep(250);
ShowMessage("Slept quarter sec");
Sleep(10000);
ShowMessage("Slept 10 sec");
Sleep(2000);
ShowMessage("Slept 2 sec");
}
void __fastcall TForm1::FormShow(TObject *Sender)
{
#if defined(_PLAT_IOS) || defined(_PLAT_ANDROID)
TThread::ForceQueue(nullptr, [this](){StartupCode();});
#endif
#if defined(_PLAT_MSWINDOWS)
StartupCode();
#endif
}
私は緑色で、少し学ぼうとしています。この奇妙な動作に遭遇したときに、Apple のアプリ開始ウォッチドッグ タイマーでスレッドが問題を起こすかどうかをテストしていました。
なぜこの動作が発生するのですか?