質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

並列処理

複数の計算が同時に実行される手法

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Q&A

解決済

1回答

2098閲覧

並列処理の中でサブウィンドウを表示させる処理

TOMO6181

総合スコア40

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

並列処理

複数の計算が同時に実行される手法

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

0グッド

0クリップ

投稿2020/09/26 12:50

現在仕事で作成しているコードで、メイン画面から呼び出されるプラグインの処理を作成しています。
プラグインの処理には時間がかかるものが含まれるため、並列処理を使用しています。
この並列処理の中で、進捗バーを表示、更新するサブウィンドウを表示させようとしています。

以下のようなコードを作成したのですが、表示されるサブウィンドウが固まったまま、ボタンも押せないという状況です。

・メイン画面の処理

C#

1using System; 2using System.Threading.Tasks; 3using System.Windows.Forms; 4 5namespace UIThreadTest 6{ 7 public partial class Form1 : Form 8 { 9 public Form1() 10 { 11 InitializeComponent(); 12 } 13 14 /// <summary> 15 /// 並列処理開始ボタン押下 16 /// </summary> 17 /// <param name="sender"></param> 18 /// <param name="e"></param> 19 private async void btnStart_Click(object sender, EventArgs e) 20 { 21 TestClass test = new TestClass(); 22 23 Task testTask = new Task(()=> 24 { 25 test.TestStart(); 26 } 27 ); 28 29 testTask.Start(); 30 31 await testTask; 32 33 MessageBox.Show("処理完了。"); 34 } 35 } 36} 37

プラグインの処理

C#

1using System.Threading; 2 3namespace UIThreadTest 4{ 5 class TestClass 6 { 7 8 public void TestStart() 9 { 10 // サブウィンドウを作成 11 Subwindow subwin = new Subwindow(); 12 // 進捗バーを設定(最小値0, 最大値100) 13 subwin.Setup(0, 100, 1); 14 15 for (int i = 0; i < 100; i++) 16 { 17 // サブウィンドウ表示 18 subwin.Show(); 19 subwin.TopMost = true; 20 subwin.TopMost = false; 21 22 // 時間のかかる処理 23 Thread.Sleep(5000); 24 25 26 subwin.Update(i); 27 } 28 } 29 30 } 31}

サブウィンドウ内の処理

C#

1using System.Windows.Forms; 2 3namespace UIThreadTest 4{ 5 public partial class Subwindow : Form 6 { 7 public Subwindow() 8 { 9 InitializeComponent(); 10 } 11 12 /// <summary> 13 /// 進捗バーの初期設定 14 /// </summary> 15 /// <param name="min">最小値</param> 16 /// <param name="max">最大値</param> 17 /// <param name="step">ステップ</param> 18 public void Setup(int min, int max, int step) 19 { 20 this.progressBar1.Minimum = min; 21 this.progressBar1.Maximum = max; 22 this.progressBar1.Step = step; 23 this.progressBar1.Value = 0; 24 } 25 26 /// <summary> 27 /// 進捗バーの更新 28 /// </summary> 29 /// <param name="value">更新値</param> 30 public void Update(int value) 31 { 32 this.progressBar1.Value = value; 33 } 34 } 35} 36

サブウィンドウのイメージ
イメージ説明

原因としては、サブウィンドウの処理がUIスレッド内で行われていないからだと思います。
メイン画面の処理でサブウィンドウの表示、更新処理等を入れたいところですが、そうすると進捗バーの更新ができず、困っています。

もし、サブウィンドウを並列処理内で呼び出して表示、更新ができる方法が分かる方がおられましたら、宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/09/27 04:25

質問者さん、最初の投稿をしたきり無言ですが、回答したのでそれに対するフィードバックを書いてください。役に立った / 立たなかったぐらいはすぐにでも返事できるのでは? 役に立たなかったなら、どこが期待する回答と違うのか書いてもらえると、代案などが出せるかもしれません。とにかく無言は NG です。
TOMO6181

2020/09/27 15:08

返信が遅くなり申し訳ありません。 お教えいただきました内容で解決することができました。
guest

回答1

0

ベストアンサー

原因としては、サブウィンドウの処理がUIスレッド内で行われていないからだと思います。

その通りだと思います。そもそもできない見当違いのことをしているような気がします。

メイン画面の処理でサブウィンドウの表示、更新処理等を入れたいところですが、そうすると進捗バーの更新ができず、困っています。

その理由が分かりませんが、以下の記事の応用でできませんか?

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

投稿2020/09/26 13:16

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TOMO6181

2020/09/27 15:07

御回答ありがとうございます。 お教えいただきましたサイトを参考にして、サブウィンドウを表示する箇所をUIスレッドで行い、 進捗バーの更新等の一部の関数をIProgressインターフェース経由で渡したところ、サブウィンドウが固まらず、進捗バーの更新もできるようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問