- PR -

Webサービスの呼び出し中にカーソルを砂時計にする

投稿者投稿内容
未記入
会議室デビュー日: 2005/10/16
投稿数: 5
投稿日時: 2005-10-16 09:22
いつもお世話になっております。
VB.NETで作成したクライアントからWebサービスを呼び出している間に、カーソルを砂時計にしたいのですが、できなくて困っています。

呼び出す前に

Cursor = Cursors.WaitCursor

を実行しているのですが、呼び出している間は、デフォルトのカーソルに戻ってしまいます。
何か解決方法をご存知であれば、教えていただけないでしょうか?
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-10-16 15:02
こんにちは。

クライアントというのは、Windows フォームと考えてよろしいですね?
試してみましたが、呼び出し中は砂時計になっています。
どのように行っていますか?
未記入
会議室デビュー日: 2005/10/16
投稿数: 5
投稿日時: 2005-10-16 15:42
囚人さん、返信ありがとうございます。

今、以下のようなコードで行っています。

<クライアントアプリ>

  Dim Service As New localhost.Service1
  Dim Message As String

  ' 砂時計にして画面を使用不可にする
  Cursor = Cursors.WaitCursor
  Me.Enabled = False

  ' WebサービスをCallする
  Message = Service.HelloWorld1

  ' カーソルを元にもどして画面を使用可能にする
  Me.Enabled = True
  Cursor = Cursors.Default

  MessageBox.Show(Message)


<Webサービス>

  <WebMethod()> _
  Public Function HelloWorld1() As String

    System.Threading.Thread.Sleep(5000)
    Return "Hello World"

  End Function

再度確認してみたところ、画面のEnabledプロパティをFalseにしていた為、発生していたことが分かりました。
ただ、カーソルを砂時計にすることも画面にロックをかけることも、両方実現したいと考えております。
何かよい方法があれば、よろしくご教授お願いします。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-10-16 15:52

処理中は処理中メッセージを表示するダイアログを出しておくとか。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-10-16 15:58
ん〜、Enabled を False にしてもできますねぇ。
自分の環境が VS2003 を消してしまって、VS2005 でしか試せないので、もしやそれのせい…?
違いはないと思うんですけども。(バグでない限り)

5秒待っているみたいですから、速過ぎて勘違いってのもなさそうですしね。
他に何か情報ないですか?
未記入
会議室デビュー日: 2005/10/16
投稿数: 5
投稿日時: 2005-10-16 16:35
Hongliangさん、囚人さん、ありがとうございます。

開発環境は、OSがWinXP SP2、VSはVS2003を使用しています。
Webサービスが稼動しているサーバは、Win2003Server、WinXP SP2の2つの環境
で実行してみましたが結果は同じでした。
関係ないかもしれませんが、IISの設定も特に変更していません。
やはり、VSが原因なのでしょうか?

できれば、カーソルを砂時計にして、処理中であるという事にしたかったのですが、Hongliangさんが仰るとおり、処理中メッセージのダイアログを表示することも検討したいと思います。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-10-16 16:47
引用:

VSが原因なのでしょうか?


VS というより、.NET のバージョンが違うから?もしや、IIS ではなく、ASP.NET開発サーバーだから?
ま、そんなわけないと思いますが^^;

代案を検討されるようなので…。
あまりにWebサービス側での時間がかかるようでしたら、非同期呼び出しを検討されてはどうでしょうか(少し面倒になりますが)。
Form を無効にするというのはありにしても、何も操作できなくなる(止まってしまう)というのは不味くないですか?

#追記
処理中ダイアログを出す、と同じですね…。失礼しました。


[ メッセージ編集済み 編集者: 囚人 編集日時 2005-10-16 16:49 ]
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-10-16 17:20
以下は推測です。

.NET Framework上ではCursorプロパティを変更すると言う単純な処理ですが、APIレベルではWM_SETCURSORイベントをアプリケーションが処理し、表示したいカーソルのハンドを返すことで実現されます。したがってUIスレッドでメッセージポンプが働いていないと、マウスカーソルを変更することは出来ません。

UIスレッド内で時間のかかる処理を行っているため(あるいはWEBサービスクライアント側の内部実装の都合か?)により、WM_SETCURSORが正しく処理されていないのだろうと思われます。WM_SETCURSORの発生するタイミングは環境によって若干異なるでしょう。したがって、OSのバージョンや、WEBサービスを呼び出すタイミング、その他の環境の影響で再現したり、しなかったりしているのではないでしょうか?

確実に表示したいのでしたら、非同期に呼び出すか、UIとは別のスレッドで呼び出すのが良いと思います。

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