- PR -

「しばらくお待ちください」の出し方を教えてください。

投稿者投稿内容
satoko-1
会議室デビュー日: 2009/03/05
投稿数: 4
お住まい・勤務地: さいたま
投稿日時: 2009-03-05 17:54
はじめまして。
satoko-1 と申します。
宜しくお願い致します。


すべてフォーム上での処理です。

SQLを利用してリストビューにデータを表示するのに、
数秒かかってしまう処理(以降、処理A)があります。

全然時間がかからない処理もあるので、
処理Aに関してのみ、「しばらくお待ちください」という
メッセージを出したいと思い、
テキストボックス txtWait なるものを作り、
以下のようにしました。

 txtWait.Text = "しばらくお待ちください"
  ' 処理A
 txtWait.Text = ""

これで、処理Aが始まる前に「しばらくお待ちください」が表示され、
処理Aが終わったら文字が消えると思っていたのですが、
どうやら処理Aが終わってから「しばらくお待ちください」という
文字が表示され、次の瞬間には文字が消えているようなのです。

txtWait.Text = "しばらくお待ちください"を読み込んだら、
すぐにテキストボックスに文字を書き込むには
どうしたらよいか教えてください。


長くなってしまい、すみません。
どうか宜しくお願い致します。
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2009-03-05 18:13
VB.NETでしょうか?・・・VB6でしょうか?
言語バージョンぐらい書きましょう。
VB.NETだと仮定して・・・
コード:
txtWait.Text = "しばらくお待ちください"
txtWait.Refresh()
 ' 処理A 


で、一応想定した動きになると思います。


が!! ...上記の様な対応は、お勧めはしません。
時間の掛かる処理などは、通常別スレッドを使用し
メインスレッドをブロックしないようなコーディングを行います。
satoko-1
会議室デビュー日: 2009/03/05
投稿数: 4
お住まい・勤務地: さいたま
投稿日時: 2009-03-05 18:25
早速のお返事ありがとうございます。

大変失礼致しました。
VB.NET です。


うまく処理することができました。
ありがとうございます。

今回は、単なるデータの照会用なので、
1つのフォーム上での処理ですが、
他のプログラムを作る際は、

 時間のかかる処理は別スレッドを使用し、
 メインスレッドをブロックしないコーディングをする。

ということに注意したいと思います。

どうもありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2009-03-05 19:46
引用:

satoko-1さんの書き込み (2009-03-05 18:25) より:

今回は、単なるデータの照会用なので、
1つのフォーム上での処理ですが、
他のプログラムを作る際は、
(snip)


Form がひとつだから問題がないということでもないです (趣味で作成しているのであれば構いませんが)。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
satoko-1
会議室デビュー日: 2009/03/05
投稿数: 4
お住まい・勤務地: さいたま
投稿日時: 2009-03-06 10:33
貴重なご意見ありがとうございます。

趣味で作成しているわけではないので、
このプログラムをリリースしようとしているわけですが、
メインスレッドをブロックしないようなコーディングをしないと、
それをリリースされた企業としては、たまったもんじゃないですよね。

プログラムを作る際には、
そういうことも考えながら作っていきたいと思います。


ただ、そのことに関して、もう1つ質問させてください。

データを参照するだけのプログラムで、
データが変更になることはないのですが、
そういう場合でも排他制御をした方がいいのでしょうか。

データの更新が無ければ必要ないと勝手に思っていたのですが…
かずい
常連さん
会議室デビュー日: 2008/09/30
投稿数: 28
お住まい・勤務地: 北海道札幌市
投稿日時: 2009-03-06 12:18
かずいといいます。

排他制御に関してですが、
照会機能でも排他制御がいるかどうかは顧客要件(業務要件)によると思います。

照会画面で見てる内容が、更新機能により変更されてもいいかなど
その画面の性質や運用方法などで変わってくると思います。
基本的には、排他制御しないのが一般的ではあると思いますが、
企業相手のプログラムということなので、確認して実装を考慮するべきです。
武史
ベテラン
会議室デビュー日: 2007/09/21
投稿数: 71
投稿日時: 2009-03-06 13:06
メインスレッドをブロックするのは、どういう問題があるのでしょうか?

せいぜい、Xで閉じないというような「親切じゃない」という程度かと
思っていました。

そのため、ユーザーインターフェースは悪くなりますが、
作り込みが単純になるぶん、メインスレッドで処理する方がよいかと
思っていました。

どんなもんでしょうか?
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2009-03-06 14:48
UIが悪くなるのは、ユーザ側が了承してれば構わないと思います。

私は、OS(Windows)からみて「行儀の悪いアプリケーション」に
なってしまうのが問題だと思います。

確か・・・5秒程度応答がないアプリケーションは
「応答なし」の烙印を押されます(ウィンドウタイトルに「応答無し」付与)
また、Xボタンを押した時には「強制終了しますか?」と聞かれます。
つまり、Windowsから見れば「フリーズしている可能性あり」と見なされています。

また、他アプリがSendMessageによるWM送出を行った場合
メッセージを処理しない限り、送出側のSendMessageは制御を返しません。
結果、他アプリも処理が止まってしまいます。

通常、ウィンドウメッセージを処理するスレッドでは
重い処理を行わない・重い処理中にメッセージ応答処理を時折入れる等を行い
ウィンドウメッセージを溜め込まないようにする必要があります。

Windowsアプリケーションとしての、もっとも基本的なマナーではないでしょうか。

ユーザーが気にしてないからとか楽にコーディングできるからなどの理由は
マナーを無視しても構わない理由にはならないと思います。

.NETの場合、かなり楽にコーディング出来るのと思いますがね。
(BackgroundWorkerも用意されていますし)

スキルアップ/キャリアアップ(JOB@IT)