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

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

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

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

WPF

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

Q&A

解決済

1回答

838閲覧

OxyPlotでdatabindingしているがOnPropatyChangedを一度しか受け付けない

yumetodo

総合スコア5850

C#

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

WPF

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

0グッド

0クリップ

投稿2017/09/17 06:38

ソースコード

https://github.com/yumetodo/prime_num_searcher

再現方法

  1. NuGetのパッケージを取得した後バッチビルドですべてのチェックを付けてビルド、prime_num_sercher_gui.exeを起動する
  2. 「求める素数の最大値」にすぐに実行が終わらない程度の値(ここでは80にした)を入力し「Benchmark」をクリック

img1
3. 下のプログレスバーがいっぱいになる前に⏸をクリック
img2
4. プログレスバーが停止し黄色になる。▶️をクリック
img3
5. プログレスバーが水色に戻り動き始め一杯にになるまで動くもののグラフが更新されない
img4

memo

  • 一時停止/再開の実装にはSemaphoreSlimを利用。

https://github.com/yumetodo/prime_num_searcher/blob/f6998d874b3bb8460b120bc86a8df05520b0ed36/prime_num_searcher_gui/BenchmarkExecuter.cs#L35

  • 再現方法手順4.

https://github.com/yumetodo/prime_num_searcher/blob/f6998d874b3bb8460b120bc86a8df05520b0ed36/prime_num_searcher_gui/MainWindow.xaml.cs#L43-L47
に制御は戻ってきてthis.benchmarkResultManager_.PlotSourcesへの代入が行われ、
https://github.com/yumetodo/prime_num_searcher/blob/f6998d874b3bb8460b120bc86a8df05520b0ed36/prime_num_searcher_gui/BenchmarkResultManager.cs#L61
this.SetPropertyが呼ばれて
https://github.com/yumetodo/prime_num_searcher/blob/f6998d874b3bb8460b120bc86a8df05520b0ed36/prime_num_searcher_gui/ValidatableDataBase.cs#L53
this.OnPropertyChangedは呼び出されている。この時代入するDictionaryは結果がすべて入っている

  • 一度も一時停止しない場合は問題ない
  • 再度benchmarkを実行して一度も一時停止しない場合も問題ない

質問

OnPropertyChangedが呼ばれてもグラフが更新されないのは何かがUIをブロックしている気がするのですが、何が原因でしょうか?

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

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

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

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

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

guest

回答1

0

自己解決

Execute と Pause が同じ参照を返してるから更新が行われない。 INotifyCollectionChanged に対応したものを使うか新しくオブジェクトを作り直す必要がある、けど OxyPlot が WPF のルールに則ってるかは知らない。

— おいがみ (@oigami013) 2017年9月17日

とのアドバイスを受け

https://github.com/yumetodo/prime_num_searcher/commit/d058f780cc33d182bc117f331d767ca74823d6de

cs

1return this.tmpResult.ToList().ToDictionary(x => x.Key, x => x.Value.ToArray().ToList());

という汚いコードに書き換えた。リアルタイムでグラフ更新はしたくなかったのでこうなった。なんだかなぁ・・・

投稿2017/09/17 09:39

yumetodo

総合スコア5850

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問