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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.91833 の関連記事表示

<< 0 >>
■91833  c# 処理中のダイアログ
□投稿者/ らんぶ -(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();
    }
    }
親記事 /過去ログ158より / 関連記事表示
削除チェック/

■91834  Re[1]: c# 処理中のダイアログ
□投稿者/ Azulean -(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
記事No.91833 のレス /過去ログ158より / 関連記事表示
削除チェック/

■91836  Re[1]: c# 処理中のダイアログ
□投稿者/ WebSurfer -(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
記事No.91833 のレス /過去ログ158より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -