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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

3回答

1628閲覧

WPF,別スレッド(Task.Run)で重たい処理をしながらそれに同期してモードレスウインドウを開いたり閉じたりしたい

ElecDove

総合スコア254

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

1クリップ

投稿2020/01/20 03:23

編集2020/01/21 02:20

WPFで時間軸に沿ってユーザにウインドウを表示したいと思いこんなソースを書いたのですがうまく動きません.
こういったことをやりたい場合どのようにするのが良いのでしょうか.
よろしくお願いいたします.

Task.Runにこだわっているわけではありません.私の知識ではこれを使うくらいしかひねり出せなかったためTask.Runを使用しています.

###やりたいこと
Startボタンを押すと,
MyWindow1が開く

1秒後にMyWindow1が閉じる
※MyWindow1は自分で追加した新しいウインドウです.

X秒後にMyWindow2が開く…

Y秒後にMyWindow2が閉じる…
以下繰返しMyWindow[N]まで続く… ※下記ソースにはMyWindow1しか書いていません
実際には,MyWindowが開いている裏でシリアル通信をしたり...メインウインドウのGUIを更新したり,,,したい

###どうなるか
MyWindowが開かない
Task.Runの外(前)でshowすればもちろん開く

C#

1private Button_Start_Click(object sender, RoutedEventArgs e){ 2 var sw = new StopWatch(); //時間計測 3 sw.start(); 4 bool flag = true; 5 6 Task.Run(()=>{ 7 while(true){ 8 var mw = new MyWindow(); 9 Dispatcher.BeginInvoke((Action)(() =>{ 10 mw.show(); //mwが表示されない 11 })); 12 if(sw.ElapsedMilliseconds > 1000 && flag){ //1000ms後に閉じてほしい 13 Dispatcher.BeginInvoke((Action)(() =>{ 14 mw.close(); //そもそも表示してないので意味がない 15 })); 16 flag = false; 17 } 18 } 19 }); 20} 21

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

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

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

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

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

dodox86

2020/01/20 06:11

ご質問は技術的には「UIスレッドとは別のスレッドからN個のウィンドウを時系列に沿ってShow()〜Close()したい」とのことで、それはそれで回答の価値はあると思いますが、そもそもアプリケーションとして、N個の別のウィンドウをシーケンシャルにShow()〜Close()する必要があるのでしょうか。例えば1個の状態表示用のウィンドウを生き続けさせて、表示したり、隠したり、情報更新するのではダメなのでしょうか。(そうだとしても別スレッドからウィンドウを操作するための注意点は残りますが)
ElecDove

2020/01/21 02:06

質問として投稿する都合上N個という風に表現いたしましたが,実際にはいろいろな内容のウインドウを使用するため,一つのウインドウを生き残らせることは難しい案件でした 共通部分が多いウインドウについては表示したり隠したりを使用しております
guest

回答3

0

自己解決

うまく動かない原因はどうやら別の場所にあったようで,結局は上述の様なコードで動きました
その過程でhihijijiさんの提示されたソースも使用し,同じようにうまく動くことを確認しました

センサからの時系列データを扱いながら時間経過によって動作を変える処理をしたいため,結局は最初のTask.Runを使ったソースに今は落ち着いています.

※根本的な原因がどこにあったのかよくわかりません…
なぜかわからないけど動かなかったのが動くようになった,みたいな状態になってしまっています.
どうやらSerialPort関連が怪しいです.

投稿2020/01/21 02:09

ElecDove

総合スコア254

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

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

0

UI データを更新するときには、thread 番号0をいつも使わなければいけません。

これではどうでしょう。

c#

1Application.Current.Dispatcher.Invoke((Action)(() =>{ 2 mw.show(); 3 }));

投稿2020/01/20 05:48

mmaeda

総合スコア269

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

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

ElecDove

2020/01/21 02:16

回答ありがとうございます 本件自体は自己解決してしまったのですが,質問があります Dispatcherは特に指定しなければthis(MainWindow)を指すことになりますが,Application.Currentは誰を指すのでしょうか
mmaeda

2020/01/21 02:32

application には、二次的な domain も存在します。二次 domain がある場合は、Application.Current が必要です。
ElecDove

2020/01/21 02:39

ごめんなさい,二次的なDomainとは何でしょうか… C#+domainで検索してみたのですがDDDくらいしか見つかりませんでした
mmaeda

2020/01/21 03:03

AppDomain.CreateDomain で検索して見てください。
guest

0

こんなのでしょうか?

C#

1private async void button_Click(object sender, RoutedEventArgs e) 2{ 3 for (int i = 0; i < 10; i++) 4 { 5 var window = new SubWindow { Title = $"SubWindow{i}" }; 6 await Task.Run(() => Dispatcher.Invoke(window.Show)); 7 await Task.Delay(1000); 8 await Task.Run(() => Dispatcher.Invoke(window.Close)); 9 } 10}

投稿2020/01/20 03:52

hihijiji

総合スコア4150

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

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

ElecDove

2020/01/21 02:12

回答ありがとうございます 最終的には自己解決してしまったのですが,それに至るまでのデバッグでいただいた方法で試させていただきうまく動くことを確認致しました 因みにですが,このソースの場合,window.show,closeの二行に関してawait Task.Run(略)する必要はあるのでしょうか? button_clickがもともとUIスレッドなので,地べたでwindow.showすればDispatcheに処理をお願いすることもなくなるのかな?と思いました (と思い試してみたところやはりちゃんと動きました) マイコンで遊んでいると,C#まで組込みチックな記述になってしまいます…
hihijiji

2020/01/21 02:15

> await Task.Run(略)する必要はあるのでしょうか? 貴方が書いた題意です。 > 別スレッド(Task.Run)からモードレスウインドウを開いたり閉じたりしたい
ElecDove

2020/01/21 02:20

> 貴方が書いた題意です。 承知いたしました. 私自身の知識不足によりTask.Run以外思いつかなかったためそのように記載しましたが不適切でした 質問タイトルを少し編集しておきます 本意は 別スレッドで重たい処理をしながらそれに合わせてモードレスウインドウを開いたり閉じたりしたい,です ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問