進捗ダイアログの使い方について

MZ Platformとは 掲示板 MZプラットフォームユーザー会掲示板 進捗ダイアログの使い方について

5 件の投稿を閲覧中 - 1 ~ 5 件(全 5 件)
  • 著者
    投稿
  • #5443
    ORIteck CO., LTD
    一般参加者

    千件以上のレコードを持つテーブル2つをMZ内で繰返し比較し値を更新したのち、データベースに登録するルーチンを作成しました。データベースへの登録方法は、1行づつのひな形文による繰返しのインサートです。(DB接続はチュートリアルの複合コンポーネントで、接続ー切断)ボタンのアクションで動作させていますが、ボタンが戻るまでに時間がかかります。(DBへの登録に時間がかかるようで)そこで、フリーズと勘違いされると困るので、進捗ダイアログを使用したいのですが使い方についてのQAがほとんどなく困っており、ご教授いただきたくお願いします。
    メッセージダイアログでも問題ないとは思っていますが、今後何かの時に経験があればと考えています。
    同等の記述のファイル添付します。

    ※データベースへの登録方法は1行づつ以外に何か方法はありますでしょうか?

    #5445
    MZPlatformユーザー会
    サイト管理者

    時間のかかる処理を実行中のときに、ダイアログを表示して操作をブロックするためには、時間のかかる処理を別のスレッドとして実行して、そのあとでモーダルダイアログを表示します。時間のかかる処理が終了したときにダイアログを閉じれば、画面の操作が再度可能になります。

    進捗ダイアログは、上記のような使い方をしたときに、全体のどの程度まで処理が進んだかを表示することができるコンポーネントです。例えば、繰り返し処理の全体の回数を最大値として、現在値を更新すれば、進捗状況が表示されます。

    つまり、使い方としてはスレッド実行と進捗ダイアログの両方の組み合わせとなりますが、適切なサンプルが配布できていないので、添付していただいたものを改変して使用例のサンプルとしました。添付の内容をご確認いただき、ご不明な点があれば再度お問い合わせください。

    添付ファイル:
    #5447
    MZPlatformユーザー会
    サイト管理者

    データベースへの登録方法について、回答が漏れていたので追記します。

    通常は一行ずつのSQL文を作成して実行するのが良いと思います。

    #5448
    ORIteck CO., LTD
    一般参加者

    ありごとうございました。使用例を参考に実現することができましがスッキリしない部分がありますのでお願いします。

    進捗ダイアログの取消アクションで何らかの処理を実行させる場合、どこまで処理がすすでいるのか?このあたりに少し疑問があります。

    まず、私なりの解釈で申し訳ありませんが、
    『進捗ダイアログはスレッドアロケータで実行中スレッドのモーダルウィンドウでありスレッドの進捗状態を、最小値、最大値、現在値で設定できれば、目視認識できるコンポーネント』このような理解で問題ないでしょうか?単に、ウィンドウを閉じれば(✖をクリック)元のスレッドに戻るし、取消ボタンでは処理の記述を実行させ、元のスレッドに戻る。

    今回のサンプルで上記であれば、進捗ダイアログの表示タイミングは、スレッドアロケータ実行と同時でしょうか?(表示は同時だが、進捗状況は設定内容の処理の時)それとも、時間のかかる処理の時に表示されるのでしょうか?

    よろしくお願いします。

    #5453
    MZPlatformユーザー会
    サイト管理者

    下記長文になりますが、解説します。

    スレッドとは、起動メソッドの実行やイベント発生が、一つずつ順番に処理が進むまとまりとお考え下さい。あるスレッドの処理中に、モーダルダイアログの表示が含まれていると、モーダルダイアログが閉じられるまでそのスレッドの処理は止まります。モーダルダイアログの表示のあとに追加されている起動メソッドは、ダイアログが閉じられてから実行されます。

    例えば、ボタンのアクションイベント発生は、画面表示用のメインのスレッドで実行されていて、その処理中にメッセージダイアログの表示が含まれていると、メッセージダイアログが閉じられるまで他の部品に触れなくなります。これがブロックと表現した状態です。ただし、このようにモーダルダイアログを表示すると、同じスレッドの中で時間のかかる処理をしながら画面をブロックしてダイアログを表示することはできません。ダイアログ表示の前に時間のかかる処理を実行すると、それが終わってからダイアログが表示されますし、ダイアログ表示の後に時間のかかる処理を実行すると、ダイアログが閉じてから処理が実行されます。

    進捗ダイアログは属性でモーダルかそうでないかが選べますが、今回の使用例はモーダルで表示しています。重要なのは、時間のかかる処理を別のスレッドで実行開始してから、進捗ダイアログを表示している点です。この順番を逆にすると動きません。別のスレッドで明示的に実行するためには、スレッドアロケータかタイマーを使う必要があります。このようにすると、時間のかかる処理を実行しながら、モーダルダイアログを表示することができます。そして、時間のかかる側で進捗ダイアログの状態を更新していて、その処理が終わったら進捗ダイアログを閉じています。

    進捗ダイアログの取消ボタンは、時間のかかる処理の状況とは独立に、進捗ダイアログを閉じてしまいます。何もしなければ、進捗ダイアログは閉じたけれども時間のかかる処理は別スレッドで終わるまで継続します。

    進捗ダイアログを表示している側のメインのスレッドと、時間のかかる処理を実行しているスレッドは独立に動作しているので、どちらかに戻るという表現は適切ではありません。単にモーダルダイアログを表示しているとメインのスレッドが止まっていて、閉じると動くというのが正しいです。

    今回は省略しましたが、進捗ダイアログの取消ボタンのアクションイベント発生では、時間のかかる処理を途中で止める処理を記述する必要があります。もちろん、進捗ダイアログの表示と時間のかかる処理のスレッドが別なので、取消ボタンを押した瞬間の別スレッドの処理の状態は多少のタイムラグがあるでしょう。それでも、例えば今回の例では繰返し処理を実行しているので、取消ボタンを押したときに繰り返し処理の現在値を取得してそれを繰り返し処理の終了値に設定すると、繰り返し処理を途中で終了することができて、別スレッドの処理を早めに終了することはできます。

    このように、進捗ダイアログを使うためにはスレッドの理解が必要で、スレッドの理解はなかなか難しいので、いろいろ実験して試してみてください。

5 件の投稿を閲覧中 - 1 ~ 5 件(全 5 件)
  • このトピックに返信するには、ログインしてください。