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

わんくま同盟

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

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

ツリー一括表示

c# 処理中のダイアログ /らんぶ (19/08/06(Tue) 22:45) #91833
Re[1]: c# 処理中のダイアログ /Azulean (19/08/06(Tue) 23:21) #91834
Re[1]: c# 処理中のダイアログ /WebSurfer (19/08/07(Wed) 09:58) #91836


親記事 / ▼[ 91834 ] ▼[ 91836 ]
■91833 / 親階層)  c# 処理中のダイアログ
□投稿者/ らんぶ (1回)-(2019/08/06(Tue) 22:45:18)

分類:[C#] 

c#で処理が重たい時に処理中のgifをだしたんですが画像がフリーズします。


form1でボタンを押すとform2が表示されpictureboxにgifの画像を表示させています。
form2を呼んでもgifの画像が固まってしまします。

どこをいじればいいでしょうか?

Fome1.cs
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        using (Form2 form = new Form2())
        {
            form.Show();
            System.Threading.Thread.Sleep(5000);
            Application.DoEvents();
        }
    }
}


Form2.cs
public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }
}

[ □ Tree ] 返信 編集キー/

▲[ 91833 ] / 返信無し
■91834 / 1階層)  Re[1]: c# 処理中のダイアログ
□投稿者/ Azulean (1077回)-(2019/08/06(Tue) 23:21:17)
No91833 (らんぶ さん) に返信
> using (Form2 form = new Form2())
> {
> form.Show();
> System.Threading.Thread.Sleep(5000);
> Application.DoEvents();
> }

メインスレッド(イベントから呼び出される処理)において、重たい処理・時間のかかる処理・処理を止めるコードを書くと、画面が固まります。
上記のコードの場合、そのメインスレッドで Sleep(5000) = 5 秒待つ(何もしない)と書いているので固まります。

DoEvents も基本的に使わず、スレッドや BackgroundWorker、タスクなどを使う場面となります。


参考
https://dobon.net/vb/dotnet/programing/progressdialogbw.html
[ 親 91833 / □ Tree ] 返信 編集キー/

▲[ 91833 ] / 返信無し
■91836 / 1階層)  Re[1]: c# 処理中のダイアログ
□投稿者/ WebSurfer (1865回)-(2019/08/07(Wed) 09:58:07)
No91833 (らんぶ さん) に返信

> c#で処理が重たい時に処理中のgifをだしたんですが画像がフリーズします。
> form1でボタンを押すとform2が表示されpictureboxにgifの画像を表示させています。
> form2を呼んでもgifの画像が固まってしまします。
> どこをいじればいいでしょうか?

まず、フリーズしないようにするためには重たい(=時間がかかる)処理は UI スレッドとは
別スレッドで非同期に実行させることです。

.NET 4.5 以降であれば、async / await を使うのがよさそうです。以下の記事が参考になると
思います。処理中であることを表示する方法も書いてあります。

WPF/Windowsフォーム:時間のかかる処理をバックグラウンドで実行するには?
https://www.atmarkit.co.jp/ait/articles/1512/02/news019.html

async / await が使えない環境であれば、デリゲートを利用して非同期にできます。そこまで
戻る必要はないかもしれませんが。

デリゲートを利用した非同期メソッドの実装
http://surferonwww.info/BlogEngine/post/2019/06/19/coding-asynchronous-method-by-using-delegate-in-windows-forms-application.aspx

[ 親 91833 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -