こんにちは、みさきと申します。
VS.NET + SQLServer2000 + Spread(GrapeCity社)などのコンポーネントを用いてシステム開発を行っています。
Spreadのデータソースへデータベースを接続して、照会画面等をいくつか作成しているのですが、データ量が多いデータベースから値を取得して表示する場合、アプリケーションが"応答なし"になるなどの症状がたまぁ〜に発生する事があります。
(Formロード→データ取得(DataSet)→Spreadへ接続→一覧表示)
これを回避しようと、スレッドを作成してSleep(s)で待機するコードを追記したいと思っているのですが、特にループするような処理がないためドコに記述するのが最適なのかわからずじまいでいます。
どなたか、ご支援いただけないでしょうか。
他に方法があるようでしたら、Sleepを無理に使用しないでも結構です。
宜しくお願いします。
応答無しは正確にはどこでどんな操作をしている時なんでしょうか?
データベース検索中?検索後の Spread 表示中?
処理途中のフォームをクリックとかした場合に[応答なし]とか表示
される場合がありますが、その事ですか?
例えば Load イベント内で時間の掛かる処理を呼び出すと、
Load イベントを抜けるまでフォームは表示されないのでは?
[VB.NET]
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Integer
For i = 0 To 5
Threading.Thread.Sleep(1000)
Next
End Sub
別スレッドなど用意せず、画面を表示しない場合でも応答なし
の状態になりますか?それとも都合が悪いですか?
データベース検索中なら別スレッドを考えてもいいかも?
検索後の Spread 表示中なら Visible = False とかで
再描画の回数を抑えると改善される場合もあります。
特攻隊長まるるうさんご回答ありがとうございます。
正確には照会Formを呼び出す条件Formがあります。
現象は、条件Formで照会Formを呼び出している場面(表示は条件form)と、照会画面が呼び出されてSpreadへデータセットされている場面とで発生します。
"応答なし"になる比率は前者の方が高いですかねぇ。
Spreadの表示まではSuspendLayoutを設定し、データセットが終了した段階で
ResumeLayout(True)を設定しております。
System.Threading.Thread.Sleep(1000) と
Application.DoEvents() とは、
組み合わせで処理させた方が良いような記述が、どこかのサイトで
見た事あるのですが、正しいのでしょうか?
あと、Sleep(n)のnはどのくらいの設定が無難なのでしょうか?
過去ログとして役立つスレッドはタイトルと質問内容が一致している
場合となります。
この為、基本は1スレッドにつき1つの質問になるように心掛けます。
また、新しい質問を書き込まれましたので、勝手ながら応答無しに
ついては解決したものと判断させて頂きます。
>System.Threading.Thread.Sleep(1000) と
>Application.DoEvents() とは、
>組み合わせで処理させた方が良いような記述
プログラムの命令は単独で1つの機能を持っています。そして
どんな動作をするかはヘルプに記述されています。
コードはその動作が必要だから書きます。結果的に Sleep
と DoEvents は、その動作目的から連続して書かれる事が
多いですが、必要だから書いているのであって、自分の実現
したい目的に必要無いのに書けば、タダの無駄なコードです。
特に DoEvents は使う事によって起こるイベントの順番や
それに伴う処理の順番が変わる可能性がありますから、目的
に応じて使わないと誤動作の原因となります。例えば↓
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200508/05080105.txt
>Sleep(n)のnはどのくらいの設定が無難
メソッドとして用意されているのですから、メソッドの仕様の
範囲内で使うのに無難も何もありません。目的に応じて設定して
下さい。不具合が起こるのであれば目的に応じた使い方が考え
られていないだけです。
例えば、アプリケーションは命令があれば可能な限りその命令を
実行しようとします。しかしCPU使用率が100%になると、他の
アプリケーションの動作が鈍くなります。この為、ループで
処理を繰り返す場合、Sleep を入れて処理を行わない時間を
作る事によって時間単位のCPU使用率を下げます。この場合
実行する処理と実行環境により適切な待機時間は違います。
Sleep 1 でいい場合もあればもっと必要な場合もあります。
結局のところ全てのコードはその行間に Sleep 0 が入って
いると考えればどうですか?必要な場所で必要な時間だけ
待つでしょう?難しく考える必要はありません。
ツイート | ![]() |