3

時間のかかる「AfterInstall」アクションを実行するInnoSetupインストールがあります。そして、このアクションが実行されている間、インストールGUIは完全にフリーズします(メインイベントループは処理されていないようです)。これは快適なエンドユーザーエクスペリエンスではないので、この操作でGUIがフリーズしない可能性はありますか?別のスレッドで実行したり、定期的に次のようなものを呼び出したりしますhandleGuiEventLoop()か?

「アクション」については、.dllから関数を呼び出して、多数のHTTPリクエストを作成し、応答をファイルとしてアプリのインストールフォルダーに書き込みます。これはCPUに負担をかけませんが、数秒かかる場合があります。または、インターネット接続が弱い/インターネット接続が利用できない場合は、1〜2分かかることがあります。そして、インストーラーGUIは常にフリーズしています。

4

2 に答える 2

6

出力の進行状況ページは、実行時間の長い操作に関するフィードバックを提供するように設計されています。

ただし、これを有効にするには、このページのメソッドを定期的に呼び出すことで、現在の進捗状況についてInnoを最新の状態に保つことができる必要があります。

Innoスクリプト関数をDLLへのコールバックとして渡すことができるライブラリがあります。これは便利な場合があります。同じサイトからITDownloadスクリプトを使用することも検討してください。これにより、仲介者を避けて、Inno自体の内部からHTTPアクセスを実行できます。

ただし、Innoは本質的にシングルスレッドでGUIスレッドアフィンであるため、ブロック操作を直接呼び出すと、特別な準備なしで常にUIがブロックされます。別のスレッド内からコードを実行することは可能です(ただし、DLL内でのみ、非常に注意する必要があります)。他のオプションには、非同期呼び出しのみ、またはGUI更新を内部的に維持する呼び出し(など)が含まれExecます。

于 2013-01-18T10:17:33.393 に答える
3

エクスペリエンスを向上させる方法は2つあります(APIの観点からのみ異なり、内部的には両方とも同じことを行います。Windowsメッセージキューをポンプします)。

  1. TOutputProgressWizardPage操作の進行状況を表示するために使用します。そのメソッドは、WindowsメッセージキューをポンプするSetProgressVCLを内部的に呼び出します。TApplication.ProcessMessages

    CreateOutputProgressPageページを作成するために使用します。

    いくつかの例:

  2. WinAPIを呼び出して、Windowsメッセージキューを明示的にポンピングしますDispatchMessage

    いくつかの例については、次のAppProcessMessage関数を参照してください。


どちらの場合も、メッセージキューのポンピングをトリガーする呼び出しを追加する必要があります。通常、処理を行うループ内。

場合によっては、それができないことがあります。たとえば、外部アプリケーションへのブロッキング呼び出しを使用して(Execまたはを使用ShellExecして)処理を行う場合です。関数の実行中に定期的にトリガーされるタイマーをスケジュールすることで、この問題を回避できます。

このアプローチは、上記のリンク先のいくつかの例で使用されています。

于 2017-07-13T04:36:19.503 に答える