喫茶XRAYトップページ

[▲前のスレッド]

[12627] 無題返信 削除
2019/3/14 (木) 17:48:07 Villa 〔HomePage
質問させていただきます。

現在、VCLフォームアプリケーションのシステムを作成しており、
TADOQueryを使用してSQL文をOpenしています。

そのデータベースの量が多く、結果のレスポンスが遅いため
progressbarを出して、styleプロパティを「pbstMarquee」に設定して起動させています。

問題はここからで、SQLの結果のレスポンスが遅いためなのか、
GUIの更新がなく、progressbarも止まったままで、SQLの結果が返ってきた後に動く、
ということになってしまっています。

どこで、マルチスレッド?のような仕組みで、
クエリのOpenとは別にProgressbarは動くようにならないものか、と思いました。

それができれば、同一フォーム内の複数のTADOQueryを同時オープンとかができるのではないか、、、など期待しております。

下手な文章ですが、もし手掛かりがあるようでしたら、教えていただけると幸いです。

よろしくお願いいたします。

[12628] クエリーの進捗をTProgressBar表示返信 削除
2019/3/14 (木) 19:30:51 Mr.XRAY
> GUIの更新がなく、progressbarも止まったままで、SQLの結果が返ってきた後に動く、
> ということになってしまっています。


う〜む.どうなんでしようね.
pbstMarquee は関係ないのかな.

クエリーの実行が遅いようですが,インデックスとかはとうなんでしよう.

こんなのもありますが・・・

[Data.Win.ADODB.TCustomADODataSet.OnFetchProgress]
http://docwiki.embarcadero.com/Libraries/Rio/ja/Data.Win.ADODB.TCustomADODataSet.OnFetchProgress

[TADOQuery で処理の進行状況を取得]
https://ht-deko.com/delphiforum/?vasthtmlaction=viewtopic&t=1184.0
↑ こんなの書いていたんだ.全く記憶にございませんです.
おそらく何かのレスとして書いたのかも知れません.


[12629] Re:クエリーの進捗をTProgressBar表示返信 削除
2019/3/15 (金) 08:28:16 SO
▼ Mr.XRAYさん
 
> クエリーの実行が遅いようですが,インデックスとかはとうなんでしよう.

DBがなんなのか分かりませんが、SSMSだと不足しているインデックスを教えてくれたりします。。。
プロのDB設計者にはかなわないと思いますが。。。

[12630] Re2:クエリーの進捗をTProgressBar表示返信 削除
2019/3/15 (金) 10:25:22 Mr.XRAY
> DBがなんなのか分かりませんが、SSMSだと不足しているインデックスを教えてくれたりします。。。
> プロのDB設計者にはかなわないと思いますが。。。


へぇ〜,そんな仕様があるんですか.スゴイですね.
Paradox や JET だとインデックがなくてもそこそこ動作するようですが,
(ある程度の自動インデックスなのか ?)
インデックスが適切でないと悲惨ですからねぇ.

DB がなんのかも分かりませんし,
Tprogressba でどこでとんな進捗状況を見るのかも分かりませんが・・・(笑)
まっ,雑談系の掲示板なので・・・


[12631] Re3:クエリーの進捗をTProgressBar表示返信 削除
2019/3/15 (金) 10:44:59 Mr.XRAY
>そのデータベースの量が多く、結果のレスポンスが遅いため

レコード数のことだと思いますが,
多い少ないも感覚的に人によりますね.
100 万で多いと言う方もいれば,1 億,2 億で多いと言う方もいるでしょうし.
一応データベースですから,数万程度では多いとは言わないかも.


[12632] Re4:クエリーの進捗をTProgressBar表示返信 削除
2019/3/15 (金) 11:01:15 SO
▼ Mr.XRAYさん
> >そのデータベースの量が多く、結果のレスポンスが遅いため
>
> レコード数のことだと思いますが,
> 多い少ないも感覚的に人によりますね.
> 100 万で多いと言う方もいれば,1 億,2 億で多いと言う方もいるでしょうし.
> 一応データベースですから,数万程度では多いとは言わないかも.


ストアドの戻りが遅いのかもしれませんね〜。

[12634] Re5:クエリーの進捗をTProgressBar表示返信 削除
2019/3/15 (金) 11:05:07 Mr.XRAY
> ストアドの戻りが遅いのかもしれませんね〜。

なるほど,これはありえますね.


[12633] Re4:クエリーの進捗をTProgressBar表示返信 削除
2019/3/15 (金) 11:03:55 Mr.XRAY
> >そのデータベースの量が多く、結果のレスポンスが遅いため

一般的には「データベースの量」という表現はないですね.
言うのであれば「データベースの数」ですね.

例えばですね.コップに水をいっぱい入れたとします.この時は
「水の量が多い」と言いますが「水の数が多い」とは言いません.


[12635] Re5:クエリーの進捗をTProgressBar表示返信 削除
2019/3/15 (金) 11:12:18 Mr.XRAY
> 例えばですね.コップに水をいっぱい入れたとします.この時は
> 「水の量が多い」と言いますが「水の数が多い」とは言いません.


コップの中の「水の『分子』の数が多い」と言えなくもない ?


[12639] Re3:クエリーの進捗をTProgressBar表示返信 削除
2019/3/15 (金) 13:42:21 Villa
▼ Mr.XRAYさん
> > DBがなんなのか分かりませんが、SSMSだと不足しているインデックスを教えてくれたりします。。。
> > プロのDB設計者にはかなわないと思いますが。。。
>
> へぇ〜,そんな仕様があるんですか.スゴイですね.
> Paradox や JET だとインデックがなくてもそこそこ動作するようですが,
> (ある程度の自動インデックスなのか ?)
> インデックスが適切でないと悲惨ですからねぇ.
>
> DB がなんのかも分かりませんし,
> Tprogressba でどこでとんな進捗状況を見るのかも分かりませんが・・・(笑)
> まっ,雑談系の掲示板なので・・・



情報が足りず、申し訳ないです。。
この問題でお聞きしたかったのはDBの遅さではなく、GUIの更新がなぜされないかということでしたので、
余分な情報は記載しておりませんでした。。

DBはSQL Serverです。

progressbarで何がしたいか、というと、
呼び出すデータが多いので、SQLが遅いこと自体は大丈夫なのですが、
ユーザーに体感的に動いていない、と思われたくないのでbarだけでも動かして、
待っていただけるような仕様にしたかった、ということです。



[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で使用できるか分かりませんが、
こんなのもありますね。。。

[12651] 雑感返信 削除
2019/3/16 (土) 17:26:38 Mr.XRAY
スレッドをざっと読み返してみると,
スゲーなぁ.
TProgressbar の問題というか現象に置き換えてしまうのもスゴイですが.
と思ったら,こんなのがありました.なるほど
Application.ProcessMessage はともかく,Sleep 関数使っていますからね.

[ProgressBar.Style := pbstMarqueeの使い方]
https://www.freeml.com/delphi-users/3479/latest

[01_Sleep 関数とマルチメディアタイマーを使用したテスト]
http://mrxray.on.coocan.jp/Delphi/plSamples/700_WaitSleep.htm#01

ですので.

プログラムというのはコードを書いて,それを実行するわけですから,
環境もコードもない質問というのはレスとレスの内容が難しいですね.
そのいい見本かも知れません.

Delphi のコミュニティの場での質問だったら絶対にレスしないですね 今は(笑)
レスしたとしても嫌味の羅列になること間違いなしです.ハハハッ.


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