喫茶XRAYトップページ

[スレッド全体
]

[12640] Re4:クエリーの進捗をTProgressBar表示返信 削除
2019/3/15 (金) 15:15:10 Mr.XRAY
> この問題でお聞きしたかったのはDBの遅さではなく、GUIの更新がなぜされないかということでしたので、

見えるオブジェクトは何でも GUI ですよね ?
何か更新どのように更新されないのですか ?
TProgressbar がバー全体で進捗状況を示す状態 (プログレスが往復する) に
ならないと思ったのですが.

だとすると,そのような更新がされないコーディングになっているとしか言えません.
だって,どんな場所でどんなようなコードなのか分かりませんので.
それ以上は何とも・・・

[ TProgressbar テストプログラム ]
http://mrxray.on.coocan.jp/Delphi/zip/plTProgressbarTest.zip
(既に削除しました)

↑ style プロパティが pbstMarquee の時は進捗状況の表示ではなく,
単に TPrgressbar のプログレスを往復表示のアニメーション表示するたけです.
このアニメーションを表示しないと言うことらしいのですが,
ちょっと分かりませんね.不思議な気もしますが.



[12641] Re5:クエリーの進捗をTProgressBar表示返信 削除
2019/3/15 (金) 16:10:23 Mr.XRAY
> 単に TPrgressbar のプログレスを往復表示のアニメーション表示するたけです.

使い方は説明するまでもないかも知れませんが,

  (1) アニメーション開始 ( style := pbstMarquee; にする)
  (2) 何かの処理
  (3) アニメーションを止める ( style := pbstNormal; にする)

ですが,何かの処理がアニメーションを止めてしまうのかも ?


[12642] Re6:クエリーの進捗をTProgressBar表示返信 削除
2019/3/15 (金) 16:18:19 Villa
▼ Mr.XRAYさん
> > 単に TPrgressbar のプログレスを往復表示のアニメーション表示するたけです.
>
> 使い方は説明するまでもないかも知れませんが,
>
>   (1) アニメーション開始 ( style := pbstMarquee; にする)
>   (2) 何かの処理
>   (3) アニメーションを止める ( style := pbstNormal; にする)
>
> ですが,何かの処理がアニメーションを止めてしまうのかも ?



まさにその問題で、通常であればpbstMarqueeでアニメーションが動く、
ということは存じ上げていますが、アニメーションを動かした後に重い処理のSQL文を
実行すると、barの進みも止まってしまい、重すぎる場合「応答なし」になります。

応答なし、になるのは構わないのですが、単にこのプログレスバーの処理を別ユニットに持たせて、
SQLを実行しているメインのユニットとは切り離してbarの進みだけでも動いておいてほしい、、、
というのが私の望みです。

[12643] 重い処理の問題返信 削除
2019/3/15 (金) 16:26:34 Mr.XRAY
▼ Villaさん

> ということは存じ上げていますが、アニメーションを動かした後に重い処理のSQL文を
> 実行すると、barの進みも止まってしまい、重すぎる場合「応答なし」になります。


なるほど.
それは TProgressbar の問題ではないですね.
その処理の問題でしょう.
 
> SQLを実行しているメインのユニットとは切り離してbarの進みだけでも動いておいてほしい、、、
> というのが私の望みです。


その処理が問題ですから,これは無理というか意味がないと思います.
TProgressbar がアニメーション表示していても,問題の処理,つまりプ処理が進んでいなくて,
停止状態になっているのですから.


[12644] 重い処理の問題返信 削除
2019/3/15 (金) 16:35:17 Mr.XRAY
> その処理の問題でしょう.

こんなとこがもしかしたら参考になるかもです.

「正しい GUI の作り方」- 重い処理で GUI が固まるのを防ぐ- PDF
http://edn.embarcadero.com/article/images/40483/2C.pdf

ただですね.私の勝手な予想ですが,
今回のはちょっと違う問題のような気がしますね.ハッキリ言って.


[12645] Re7:クエリーの進捗をTProgressBar表示返信 削除
2019/3/15 (金) 16:47:15 Mr.XRAY
▼ Villaさん

> 応答なし、になるのは構わないのですが、単にこのプログレスバーの処理を別ユニットに持たせて、

そんなの変です.
処理が止まっているのにプログレスがアニメーション表示していたら,
ユーザは処理が続いていると思いますよ.
変です !!
顔を洗って出直して来てください (笑)


[12646] Re8:クエリーの進捗をTProgressBar表示返信 削除
2019/3/15 (金) 19:08:47 Villa
▼ Mr.XRAYさん
> ▼ Villaさん
>
> > 応答なし、になるのは構わないのですが、単にこのプログレスバーの処理を別ユニットに持たせて、
>
> そんなの変です.
> 処理が止まっているのにプログレスがアニメーション表示していたら,
> ユーザは処理が続いていると思いますよ.
> 変です !!
> 顔を洗って出直して来てください (笑)


またまた私の言葉が足りず、申し訳ないです。

SQLで行っている処理がややこしく、どうしてもクエリ結果が帰ってくるのに30秒くらいかかります。

その30秒の間、「応答なし」と出たとしても20〜30秒後にはきちんと結果はかえってきて、
DBGridに表示もされるので、
その約30秒のは間違いなく動いてはいるのですが、重くて固まる?のか応答なしになる、ということです。


そこで、progressbarのアニメーションだけでも動いてくれないかなぁ。。という願望です。笑

まさにxrayさんが添付しているpdfを見て、
ここの方ならより良い方法を教えていただけるのではないか、、と思い、相談しました。

が、どうやらこのpdfにある通り、マルチスレッド?処理でGUIを無理やり更新する?という方法しかなさそうですね。

[12647] Re8:クエリーの進捗をTProgressBar表示返信 削除
2019/3/15 (金) 19:14:10 Villa
▼ Mr.XRAYさん
> ▼ Villaさん
>
> > 応答なし、になるのは構わないのですが、単にこのプログレスバーの処理を別ユニットに持たせて、
>
> そんなの変です.
> 処理が止まっているのにプログレスがアニメーション表示していたら,
> ユーザは処理が続いていると思いますよ.
> 変です !!
> 顔を洗って出直して来てください (笑)



ちなみにソースですが、

      ProgressBar1.Visible:=True;
      ProgressBar1.Style:=pbstMarquee;

      ADOQuery1.SQL.Text:='SQL文';
      ADOQuery1.Open;

      ProgressBar1.Visible:=False;


これだけです。。

画面にはDBGridがあり、TDataSourceとつながっています。

[12648] Re9:クエリーの進捗をTProgressBar表示返信 削除
2019/3/15 (金) 21:04:25 Mr.XRAY
▼ Villaさん

> これだけです。。
>
>画面にはDBGridがあり、TDataSourceとつながっています。


う〜ん,何とも言えませんが,スレッド処理してみたらどうでしょう.


[12649] Re10:クエリーの進捗をTProgressBar表示返信 削除
2019/3/16 (土) 08:12:00 Villa
▼ Mr.XRAYさん
>
> う〜ん,何とも言えませんが,スレッド処理してみたらどうでしょう.


色々な可能性を教えていただき、ありがとうございます!

まずはスレッド処理でしてみたいと思います!

[12650] Re11:クエリーの進捗をTProgressBar表示返信 削除
2019/3/16 (土) 11:01:05 Mr.XRAY
▼ Villaさん

> まずはスレッド処理でしてみたいと思います!

えっと,プログレスバーの表示部分ではなく,
「重たい処理,時間のかかる処理」の部分を別スレッドにします.
今回の場合,プログレスバーの動作が重たくて時間がかかるわけではありません.
一応念のため.


[12657] Re11:クエリーの進捗をTProgressBar表示返信 削除
2019/3/18 (月) 13:09:34 SO
▼ Villaさん

http://www.delphiarea.com/products/delphi-components/backgroundworker/

お使いのDelphiで使用できるか分かりませんが、
こんなのもありますね。。。

[▼次のスレッド]
INCM/CMT
Cyclamen v3.82