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

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

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

Re[2]: C# chart について


(過去ログ 110 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■65096 / inTopicNo.1)  C# chart について
  
□投稿者/ katsu (1回)-(2013/02/04(Mon) 21:01:57)

分類:[C#] 

VS2010 C# を使用しています

chartでグラフ表示中にたまに例外処理が発生します
たまにとは、50〜1500回に一度です

エラー内容
chart1.Series = 'chart1.Series' は、型 'System.NullReferenceException' の例外をスローしました。
base {System.SystemException} = {"オブジェクト参照がオブジェクト インスタンスに設定されていません。"}

chartの使い方がまずいのだと思うのですが、何が悪いのかよくわかりません
すみませんが、ご教授願います

実行内容
1.メインフォームのボタンを押すと子フォームを8個立ち上げます
2.子フォームでそれぞれイーサネットでデータを受信(非同期)
3.受信したデータをテキストファイルに保存、グラフ表示
4.2、3を繰り返し

どこを抜粋してよいかわからず長くなり申し訳ありません
子フォームプログラム
public partial class Graph0 : Form
{
Series series1 = new Series("X:Stroke[mm] Y:Press[kN]");
private void Graph0_Load(object sender, EventArgs e)
{
plot_ini();
plot();
// ワーカースレッドの作成と開始
work = new System.Threading.Thread(DoWork);
work.Start();
}
public void DoWork()
{
// リスナーを作成する
server = new TcpListener(IPAddress.Any, 1001);
server.Start();
while (true)
{
// データ受信
TcpClient client = server.AcceptTcpClient();
//受信処理省略
plot_clear();
client.Close();
data_input(); //受信データを配列に
data_save(); //受信データをテキストファイルで保存
veiw_results(); //受信データの一部をリストビューで表示
plot();
}
}
public void plot_ini() //chart初期設定
public void plot_clear()
{
series1.Points.Clear();
chart1.Series.Clear();
listView1.Clear();
}
public void plot() //グラフ表示
{
try
{
for (int i = 0; i < graph_data_count; i++)
{
series1.Points.AddXY(double.Parse(data_x[i]), double.Parse(data_y[i]));
}
chart1.Series.Add(series1);
}
catch (Exception ex)
{
System.Console.WriteLine(ex.Message); //例外処理発生
}
}
引用返信 編集キー/
■65099 / inTopicNo.2)  Re[1]: C# chart について
□投稿者/ Azulean (90回)-(2013/02/04(Mon) 22:30:02)
2013/02/04(Mon) 22:30:46 編集(投稿者)

画面に表示するコントロールが使用するインスタンスを、別のスレッドで勝手に書き換えていることが問題ではないでしょうか。
Series の変更を UI スレッドで実行するように変更を検討してください。
(BackgroundWorker の DoWork イベントおよびそのイベントから呼び出されるメソッドが実行されるスレッドはワーカースレッドと呼ばれ、そのスレッド内で画面の表示に関わる操作はできません)

方法としては、Invoke で UI スレッドに委譲する、戻り値として必要な情報を返して RunWorkerCompleted イベントで Series の変更をするかでしょうか。
引用返信 編集キー/
■65115 / inTopicNo.3)  Re[2]: C# chart について
□投稿者/ katsu (2回)-(2013/02/06(Wed) 17:33:46)
No65099 (Azulean さん) に返信
> 2013/02/04(Mon) 22:30:46 編集(投稿者)

Azulean様
回答ありがとうございます

6000回程度、処理を続けていますが、例外処理が発生しませんので、改善されたのではないかと思います
修正がまずいようでしたら、ご指摘頂けると助かります

下記のように処理を行いました

public void plot()
{
if (InvokeRequired)
{
Invoke((Action)delegate() { plot(); });
return;
}
//描画処理
}

とても困っていたので感謝しております
また質問の時は、よろしくお願いします
ありがとうございました
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -