C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: BackgroundWorker処理中に砂時計が"I"になる


(過去ログ 99 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■58896 / inTopicNo.1)  BackgroundWorker処理中に砂時計が"I"になる
  
□投稿者/ あころ (1回)-(2011/05/03(Tue) 14:23:18)

分類:[C#] 

2011/05/03(Tue) 14:49:11 編集(投稿者)
2011/05/03(Tue) 14:45:32 編集(投稿者)
2011/05/03(Tue) 14:45:27 編集(投稿者)

<pre><pre>はじめまして。

C#でBackgroundWorkerを使用するアプリを作りました。
しかし、アプリを実行すると、BackgroundWorker.RunWorkerAsync後にカーソルが"I(I ビーム カーソル)"になってしまいます。
RunWorkerAsync前にSleep(1000);を入れてみたらSleep中は砂時計になり、その後"I"になります。
backgroundWorker1_RunWorkerCompletedまで、アイコンを砂時計のままにしたいのですが、出来ていません。

何がおかしいのかがわからなく模索しているところです。なにかヒントをいただけないでしょうか。



ソースは下記になります。
public void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
button1.Text = "処理中";
this.Cursor = Cursors.WaitCursor;
backgroundWorker1.RunWorkerAsync(100);

}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
(重い処理...)
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
(後処理...)
this.Cursor = Cursors.Default;
button1.Enabled = true;
button1.Text = "開始";
}


</pre></pre>
引用返信 編集キー/
■58898 / inTopicNo.2)  Re[1]: BackgroundWorker処理中に砂時計が"I"になる
□投稿者/ やじゅ (1883回)-(2011/05/03(Tue) 15:05:07)
やじゅ さんの Web サイト
No58896 (あころ さん) に返信
> C#でBackgroundWorkerを使用するアプリを作りました。
> しかし、アプリを実行すると、BackgroundWorker.RunWorkerAsync後にカーソルが"I(I ビーム カーソル)"になってしまいます。
> RunWorkerAsync前にSleep(1000);を入れてみたらSleep中は砂時計になり、その後"I"になります。

Application.UseWaitCursorを使ってみるとどうなりますか?
http://dobon.net/vb/dotnet/form/cursorcurrent.html

引用返信 編集キー/
■58900 / inTopicNo.3)  Re[2]: BackgroundWorker処理中に砂時計が"I"になる
□投稿者/ あころ (2回)-(2011/05/03(Tue) 15:51:27)
No58898 (やじゅ さん) に返信
> ■No58896 (あころ さん) に返信
>>C#でBackgroundWorkerを使用するアプリを作りました。
>>しかし、アプリを実行すると、BackgroundWorker.RunWorkerAsync後にカーソルが"I(I ビーム カーソル)"になってしまいます。
>>RunWorkerAsync前にSleep(1000);を入れてみたらSleep中は砂時計になり、その後"I"になります。
>
> Application.UseWaitCursorを使ってみるとどうなりますか?
> http://dobon.net/vb/dotnet/form/cursorcurrent.html
>

Application.UseWaitCursorを使用しても動作は変わりませんでした。Ibeamになります。
引用返信 編集キー/
■58901 / inTopicNo.4)  Re[3]: BackgroundWorker処理中に砂時計が"I"になる
□投稿者/ Azulean (736回)-(2011/05/03(Tue) 15:55:55)
No58900 (あころ さん) に返信
> Application.UseWaitCursorを使用しても動作は変わりませんでした。Ibeamになります。

フォーム上、すべての場所でそうなるのですか?
特定のコントロール上でそうなるのですか?
フォームはどのようなコントロールで構成されていますか?
(テキストボックスが全体にあるとかそういったこともないですよね?)
DoWork イベントの中を Sleep(5000); だけにした場合もカーソルがそうなりますか?(処理に依存しない?)


正直なところ、第三者が推測するには材料が足りません。
引用返信 編集キー/
■58902 / inTopicNo.5)  Re[4]: BackgroundWorker処理中に砂時計が"I"になる
□投稿者/ あころ (3回)-(2011/05/03(Tue) 16:55:24)
2011/05/03(Tue) 16:57:23 編集(投稿者)
No58901 (Azulean さん) に返信
> ■No58900 (あころ さん) に返信
>>Application.UseWaitCursorを使用しても動作は変わりませんでした。Ibeamになります。
> 
> フォーム上、すべての場所でそうなるのですか?
> 特定のコントロール上でそうなるのですか?
> フォームはどのようなコントロールで構成されていますか?
> (テキストボックスが全体にあるとかそういったこともないですよね?)
> DoWork イベントの中を Sleep(5000); だけにした場合もカーソルがそうなりますか?(処理に依存しない?)
> 
> 
> 正直なところ、第三者が推測するには材料が足りません。

返信ありがとうございます。Azuleanさんの書き込みがヒントになり、Ibeamになる場所がわかりました。
backgroundWorker1_RunWorkerCompleted中で、Textboxのコントロールの描画を一時停止をしていました。
WM_SETREDRAW メッセージを送るとアイコンがIbeamになります。コメントアウトすると砂時計になります。

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            SendMessage(this.Handle, WM_SETREDRAW, Win32False, 0);    ←ここ
            foreach (string ss in aArrayList)
            {
                TextBox1.AppendText(ss);
            }
            SendMessage(this.Handle, WM_SETREDRAW, Win32True, 0);
            this.Refresh();
            this.Cursor = Cursors.Default;
            button1.Enabled = true;
            button1.Text = "開始";
        }

しかし、WM_SETREDRAWメッセージを送るとなぜIbeamになるのかが、解っていません。
もうすこし調べてみます。もしヒントがあれば、ご教授おねがいします。


ご質問について
フォーム上、すべての場所でそうなるのですか?
=>はい、Ibeamになります。

特定のコントロール上でそうなるのですか?
=>いいえ、すべてIbeamになります。

フォームはどのようなコントロールで構成されていますか?
=>textbox1 ,button1,backgroundWorker1になります。計算結果をtextbox1に最後に表示しています。

DoWork イベントの中を Sleep(5000); だけにした場合もカーソルがそうなりますか?(処理に依存しない?)
=>カーソルは砂時計になります。(思いどおりの動作)





引用返信 編集キー/
■58908 / inTopicNo.6)  Re[5]: BackgroundWorker処理中に砂時計が"I"になる
□投稿者/ Azulean (738回)-(2011/05/03(Tue) 17:47:58)
2011/05/03(Tue) 17:48:57 編集(投稿者)
No58902 (あころ さん) に返信
>foreach (string ss in aArrayList)
>{
>    TextBox1.AppendText(ss);
>}

この部分は、AppendText をループしないとダメなんでしょうか?

StringBuilder sb = new StringBuilder();
foreach (string ss in aArrayList)
{
  sb.Append(ss);
}
TextBox1.AppendText(sb.ToString());

のようにまとめて追加とか。
あとは、string.Join でまとめるとか。


# 徐々に表示されるのが嫌だから複雑なことをしているとみています。

引用返信 編集キー/
■58923 / inTopicNo.7)  Re[6]: BackgroundWorker処理中に砂時計が"I"になる
□投稿者/ あころ (4回)-(2011/05/04(Wed) 20:21:18)
No58908 (Azulean さん) に返信
> 2011/05/03(Tue) 17:48:57 編集(投稿者)
>
>
> # 徐々に表示されるのが嫌だから複雑なことをしているとみています。
遅くなりました。返信ありがとうございます。

Azuleanさんのおっしゃるとおりです。
解析件数が増えると、描画で時間が取られるようになり、WM_SETREDRAWメッセージ使用した次第です。
StringBuilderを使用し、WM_SETREDRAWメッセージをやめたことでカーソルが思いどおりの動きをしてくれました。

アドバイスありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -