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

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

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

非同期処理

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

■102807 / inTopicNo.1)  非同期処理
  
□投稿者/ まさ (5回)-(2024/01/06(Sat) 09:59:28)

分類:[.NET 全般] 

C# Windowsフォームアプリケーション .NetFramework

宜しくお願い致します

form1で1秒毎に外部機器からデータを呼び出して折れ線グラフで表示しています。
そしてそのデータを日付のファイルにcsvで書き込んでいます(1秒毎ですので1日約9万件)

それをform3で1週間分の棒グラフを表示させています(form1は表示したまま)

データの保存、表示は出来ているのですが、作り方を分かっていなかったので
form3のグラフを集計、表示させている間にform1の折れ線グラフが止まっていました

調べましてform3の集計を非同期で処理させようと思ったのですがうまくいかず
何かいい方法はありましたら教えて頂けないでしょうか
宜しくお願い致します


using System;
using System.Collections.Generic;
using System.Drawing;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
using System.IO;

using System.Globalization;


namespace グラフ表示
{
    public partial class Form3 : Form
    {

        private Form1 form1Instance;

        private Dictionary<DateTime, double> dailyTotals;

        public Form3(Form1 form1)
        {
            InitializeComponent();
            
            form1Instance = form1;

            timer1 = new Timer();
            timer1.Interval = 1000; 
            timer1.Tick += timer1_Tick;
            timer1.Start();
        }

        private void Form3_Load(object sender, EventArgs e)
        {

            day7();
            line7();

            lblDate.Text = "2000/00/00";
            lblTime.Text = "00:00:00";
        }

        private void btnMainMenu_Click(object sender, EventArgs e)
        {  
            var form2 = new Form2(new Form1());
            form2.Show();
            this.Close();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            lblDate.Text = DateTime.Now.ToString("yyyy/M/d");
            lblTime.Text = DateTime.Now.ToString("HH:mm:ss");

        }
  
        private Dictionary<DateTime, double> AggregateDailyTotals(string inputDirectory)
        {
            Dictionary<DateTime, double> dailyTotals = new Dictionary<DateTime, double>();

            foreach (string filePath in Directory.GetFiles(inputDirectory, "*.csv"))
            {
                ParseCSVFile(filePath, dailyTotals);
            }
            return dailyTotals;
        }

        
        private void ParseCSVFile(string filePath, Dictionary<DateTime, double> dailyTotals)
        {
            try
            {
                foreach (string line in File.ReadLines(filePath))
                {
                    string[] fields = line.Split(','); // カンマで分割
                    string dateString = fields[0];// 日付を取得します(日付がA列にある)
                    DateTime date;

                    if (DateTime.TryParseExact(dateString, "yyyy/M/d", CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
                    {
                        double value;
                        if (double.TryParse(fields[2], out value)) // C列値
                        {

                            if (dailyTotals.ContainsKey(date))// 日付毎に集計
                            {
                                dailyTotals[date] += value;
                              
                            }
                            else
                            {
                                dailyTotals[date] = value;
                            }
                            
                        }
                    }
                }
                
            }
            catch (Exception ex) 
            {
                MessageBox.Show("以下の理由でファイルが開けません。\n" + ex.Message);
            }
        }

        private void day7()
        {
            string inputDirectory = G.csvDataFilePath;// 入力ディレクトリのパスを指定
            dailyTotals = AggregateDailyTotals(inputDirectory);// 集計結果を取得

            Dictionary<DateTime, double> last7DaysTotals = GetLast7DaysTotals();// 過去7日間の集計結果を取得
            dataGridView1.Rows.Clear();                         // DataGridViewに結果を表示

            foreach (DateTime date in GetLast7DaysDates())
            {
                double total = last7DaysTotals.ContainsKey(date) ? last7DaysTotals[date] : 0.0;
                dataGridView1.Rows.Add(date.ToString("yyyy/M/d"), total);
            }
        }

        private Dictionary<DateTime, double> GetLast7DaysTotals()
        {
            DateTime currentDate = DateTime.Now.Date;
            DateTime sevenDaysAgo = currentDate.AddDays(-7);

            Dictionary<DateTime, double> last7DaysTotals = new Dictionary<DateTime, double>();

            foreach (var entry in dailyTotals)
            {
                if (entry.Key >= sevenDaysAgo && entry.Key <= currentDate)
                {
                    last7DaysTotals[entry.Key] = entry.Value;
                }
            }
            return last7DaysTotals;
        }

        private IEnumerable<DateTime> GetLast7DaysDates()
        {
            DateTime currentDate = DateTime.Now.Date;

            for (int i = 7; i >= 0; i--)
            {
                yield return currentDate.AddDays(-i);
            }
        }
        
        private void line7()
        {                                                       // 7日前から本日までの日ごとの集計結果を取得
            Dictionary<DateTime, double> last7DaysTotals = GetLast7DaysTotals();

            chart1.Series.Clear();                              // グラフを初期化
            chart1.Titles.Clear();

            Series series = new Series("過去8日間の合計");
            series.ChartType = SeriesChartType.Column;

            foreach (DateTime date in GetLast7DaysDates())
            {
                double total = last7DaysTotals.ContainsKey(date) ? last7DaysTotals[date] : 0.0;

                DataPoint dataPoint = new DataPoint();
                dataPoint.SetValueXY(date.ToString("yyyy/M/d"), (total/60));//60
                dataPoint.Label = (total/60).ToString("0.0");             
                series.Points.Add(dataPoint);
            }
	
	//グラフ表示
            chart1.Series.Add(series);                         
            Title title=chart1.Titles.Add("過去8日間の合計");  
            chart1.Visible = true;                             
            title.Font = new Font("Arial", 20, FontStyle.Bold);
            //chart1.Update();
        }
    }
}

引用返信 編集キー/
■102808 / inTopicNo.2)  Re[1]: 非同期処理
□投稿者/ WebSurfer (2866回)-(2024/01/06(Sat) 10:52:42)
No102807 (まさ さん) に返信

> 調べましてform3の集計を非同期で処理させようと思ったのですがうまくいかず

「form3の集計」で非同期で処理したい部分、すなわち UI スレッドとは別のスレ
ッドで動かしたい部分というのはコードのどの部分なのですか?

「うまくいかず」では何がどううまくいかないのか分かりません。どういうことを
期待して、どういうコードを書いたが、その実行結果は期待したこととどう違うの
かを具体的に書いてください。

ひょっとして「非同期で処理」による処理時間の短縮を期待してますか? GUI ア
プリの非同期プログラミングの目的は UI 応答性を高めることで、処理時間の短縮
にはならないので、それを期待しているとすると無駄なことをしている可能性があ
りますが。
引用返信 編集キー/
■102812 / inTopicNo.3)  Re[1]: 非同期処理
□投稿者/ とっちゃん (805回)-(2024/01/06(Sat) 15:37:03)
No102807 (まさ さん) に返信
> C# Windowsフォームアプリケーション .NetFramework
>
> 宜しくお願い致します
>
> form1で1秒毎に外部機器からデータを呼び出して折れ線グラフで表示しています。
> そしてそのデータを日付のファイルにcsvで書き込んでいます(1秒毎ですので1日約9万件)
>
> それをform3で1週間分の棒グラフを表示させています(form1は表示したまま)
>
> データの保存、表示は出来ているのですが、作り方を分かっていなかったので
> form3のグラフを集計、表示させている間にform1の折れ線グラフが止まっていました
>
> 調べましてform3の集計を非同期で処理させようと思ったのですがうまくいかず
> 何かいい方法はありましたら教えて頂けないでしょうか
> 宜しくお願い致します
>

取りこぼすのは、form1 側ですか?それともform3 側ですか?

取りこぼしが発生するのが具体的にどのタイミングですか?

form3を表示しようとしたとき(表示されたら取りこぼしが発生しなくなる)
のか、form3を表示している間はずっと取り込みできなくなっているのか
では状況が異なります。

ですが、どちらの場合においても非同期に処理すべきは、form3ではなく、
form1のそれも外部機器との連動部分です。

具体的には、
> form1で1秒毎に外部機器からデータを呼び出して
ですね。

ここの段取りを、UIスレッド以外で処理するようにすれば取りこぼしが
発生しなくなるのではないかと思います。

引用返信 編集キー/
■102813 / inTopicNo.4)  Re[2]: 非同期処理
□投稿者/ まさ (6回)-(2024/01/06(Sat) 17:58:14)
No102812 (とっちゃん さん) に返信
> ■No102807 (まさ さん) に返信
>>C# Windowsフォームアプリケーション .NetFramework
ありがとうございます
 form1で1秒毎にデータを読込み折れ線グラフを表示させている時
form3を走らせるとform1の折れ線グラフが止まってしまします
form1をどのように変更させて頂けばよろしいでしょうか

using Opc.UaFx.Client;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
using static System.Windows.Forms.DataFormats;
using System.Threading.Tasks;


namespace グラフ表示
{
    public partial class Form1 : Form
    {

        private Timer dataLoadTimer;
        private int dataCounter;

        private OpcClient client;
        private DateTime startTime;

        private Timer timer;
        private Random random;
        private Chart upperChart;
        private Chart lowerChart;

        string currentDate = DateTime.Now.ToString("yyyyMd");

        int cycletime;

        private List<double> upperList;
        private List<double> lowerList;
        
        public Form1()
        {
            InitializeComponent();
            cycletime = 300;

            random = new Random();
            CreateChart();
        }

        private void CreateChart() 
        {
            IEnumerable<double> doubles = Enumerable.Repeat(double.NaN, cycletime + 1);

            upperChart = CreateChart(upperList = new List<double>(doubles));
            upperChart.Location = new System.Drawing.Point(280, 180);
            this.Controls.Add(upperChart);

            lowerChart = CreateChart(lowerList = new List<double>(doubles));
            lowerChart.Location = new System.Drawing.Point(280, 490);
            this.Controls.Add(lowerChart);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string csvFilePath = G.priceDataFilePath;
            ReadValueAndDisplayInLabel(csvFilePath);
        }

        private void ReadValueAndDisplayInLabel(string filePath)
        {
            try
            {
                G.priceData = ReadValueFromCSV(filePath);
                label11.Text = G.priceData.ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show("エラー: " + ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private int ReadValueFromCSV(string filePath)
        {
            int result = 0;

            try
            {
                string[] lines = File.ReadAllLines(filePath);

                if (lines.Length > 0)
                {
                    if (int.TryParse(lines[0], out result))
                    {
                        Console.WriteLine("CSVファイルから数値を正しく読み取りました。");
                    }
                    else
                    {
                        Console.WriteLine("CSVファイルの最初の行が数値ではありません。");
                    }
                }
                else
                {
                    Console.WriteLine("CSVファイルが空です。");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("エラー: " + ex.Message);
            }
            return result;
        }

引用返信 編集キー/
■102814 / inTopicNo.5)  Re[3]: 非同期処理
□投稿者/ まさ (7回)-(2024/01/06(Sat) 17:59:41)
       private void btnHome_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2(this);
            form2.Show();
        }

        private void btnStart1_Click(object sender, EventArgs e)
        {
            if (chkRandom.Checked) {}
            else 
            { 
                if (client == null || client.State != OpcClientState.Connecting)
                {
                    try
                    {
                        string url = "opc.tcp://192.168.0.1:4840";
                        string user = "admin";
                        string password = "admin";

                        client = new OpcClient(url);
                        client.Security.UserIdentity = new OpcClientIdentity(user, password);
                        lbltext.Text = "通信開始";

                        client.Connect();
                        
                        lbltext.Text = "通信OK";
                    }
                    catch (Exception ex)
                    { 
                        lbltext.Text = "通信NG";
                    }
                }
            }
            
            startTime = DateTime.UtcNow;
           
            dataLoadTimer = new Timer();
            dataLoadTimer.Interval = 1000; 
            dataLoadTimer.Tick += (s, a) => DataLoadTimer_Tick();////// a でいいのか&#10067;
            dataLoadTimer.Start();

        }

        private void DataLoadTimer_Tick()
        {
            
            LoadData();
        }

        private void btnStop1_Click(object sender, EventArgs e)
        {
            dataLoadTimer.Stop();
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private Chart CreateChart(IList<double> doubles)
        {

            Chart chart = new Chart();
            chart.Size = new System.Drawing.Size(980, 300);
            chart.ChartAreas.Add(new ChartArea());
            chart.Series.Add("DataSeries");
            chart.Series["DataSeries"].ChartType = SeriesChartType.Line;
            chart.Series["DataSeries"].BorderWidth = 2; 

                    chart.ChartAreas[0].AxisX.LabelStyle.Enabled = true;
                    for (int i = 0; i < doubles.Count; i++)
                    {
                        chart.Series["DataSeries"].Points.AddXY(i, doubles[i]);
                    }

            chart.ChartAreas[0].AxisX.Minimum = 0;    
            chart.ChartAreas[0].AxisX.Maximum = doubles.Count - 1;

            return chart;
        }


        private void SlideData(Chart chart, List<double> list, double newData)
        {
            list.Add(newData);
            list.RemoveAt(0);

            chart.Series["DataSeries"].Points.Clear();
            for (int x = 0; x < list.Count; x++)
            {
                chart.Series["DataSeries"].Points.AddXY(x, list[x]);
            }
        }

        private void LoadData()
        {
            
                try
                {
                    var currentTime = DateTime.UtcNow;
                    var elapsedTime = currentTime - startTime;

                    var flowNode = "ns=3;i=16844032";
                    var accumflowNode = "ns=3;i=16843776";
                    var pressureNode = "ns=3;i=16844544";
                    var tempNode = "ns=3;i=16844288";

                    var flow = client.ReadNode(flowNode);
                    var accumFlow = client.ReadNode(accumflowNode);
                    var pressure = client.ReadNode(pressureNode);
                    var temp = client.ReadNode(tempNode);

                    double flowData = Convert.ToInt32(flow.Value) / 1000.0;
                    double accumeData = Convert.ToInt32(accumFlow.Value) / 1000.0;
                    double pressureData = Convert.ToInt32(pressure.Value) / 1000.0;
                    double tempData = Convert.ToInt32(temp.Value) / 10.0;

                   
                    SlideData(upperChart, upperList, pressureData);
                    SlideData(lowerChart, lowerList, tempData);


                    //-------保存内容--------
                    DateTime dt = DateTime.Now;
                    string date = dt.ToString("yyyy/M/d");
                    string time = dt.ToString("HH:mm:ss");

                    string data1 = flowData.ToString();
                    string data2 = tempData.ToString();
                    string data3 = pressureData.ToString();
                    string data4 = accumeData.ToString();

                    string price = G.priceData.ToString();


                    SaveDataToCSV(date, time, data1, data2,data3,data4,price);

                    upperChart.ChartAreas[0].AxisX.Minimum = dataCounter >= cycletime ? dataCounter - cycletime : 0;
                    upperChart.ChartAreas[0].AxisX.Maximum = dataCounter;

                    lowerChart.ChartAreas[0].AxisX.Minimum = dataCounter >= cycletime ? dataCounter - cycletime : 0;
                    lowerChart.ChartAreas[0].AxisX.Maximum = dataCounter;


                    while (upperChart.Series["DataSeries"].Points.Count > 0 && upperChart.Series["DataSeries"].Points[0].XValue < dataCounter - cycletime)
                    {
                        upperChart.Series["DataSeries"].Points.RemoveAt(0);
                        lowerChart.Series["DataSeries"].Points.RemoveAt(0);

                        upperChart.ChartAreas[0].AxisX.Maximum = dataCounter;
                        lowerChart.ChartAreas[0].AxisX.Maximum = dataCounter;
                    }
                    
                    lbltext.Text = "通信中";
                }
                catch (Exception ex)
                {
                    lbltext.Text = ex.Message;
                    lbltext.Text = ex.StackTrace;
                }
        }


        private void SaveDataToCSV(string date, string time, string data1,string data2, string data3, string data4, string price)
        {
            try
            {
                string filePath = G.csvDataFilePath + DateTime.Now.ToString(@"yyyy\-M\-d") + ".csv";
               
                using (StreamWriter sw = File.AppendText(filePath))
                {
                    sw.WriteLine($"{date},{time},{data1},{data2},{data3},{data4},{price}");
                }
            }
            catch (Exception ex)
            {
                timer.Enabled = false;
                MessageBox.Show("以下の理由でファイルが開けません。\n" + ex.Message);
                timer.Enabled = true;
            }
        }
    }
}

引用返信 編集キー/
■102815 / inTopicNo.6)  Re[3]: 非同期処理
□投稿者/ furu (224回)-(2024/01/06(Sat) 20:29:20)
No102813 (まさ さん) に返信
> form1で1秒毎にデータを読込み折れ線グラフを表示させている時
> form3を走らせるとform1の折れ線グラフが止まってしまします
form3を走らせるところがありませんが
どう走らせていますか?

form1を表示中form3を走らせるのに
なぜform3でform1を作成(new Form1())しているのですか?
引用返信 編集キー/
■102816 / inTopicNo.7)  Re[4]: 非同期処理
□投稿者/ とっちゃん (806回)-(2024/01/06(Sat) 22:26:26)
No102813 (まさ さん) に返信
> ■No102812 (とっちゃん さん) に返信
>>■No102807 (まさ さん) に返信
> >>C# Windowsフォームアプリケーション .NetFramework
> ありがとうございます
> form1で1秒毎にデータを読込み折れ線グラフを表示させている時
> form3を走らせるとform1の折れ線グラフが止まってしまします
> form1をどのように変更させて頂けばよろしいでしょうか
>
furuさんからも指摘がありますが、form3 はどのように走らせているのでしょうか?

それによって、改善ポイントが変わってくるのではないか?と思います。

それと、取りこぼしは、たまに起こる(1秒だけ抜けてるなど)のか
form3を表示している間ずっと起こるのでしょうか?

後者であれば、おそらく、form3 を走らせるというのは、Process.Start() を指していて
Process.WaitForExit()で終了待ちしているのでは?と想像ができます。

もしそうだとすると、WaitForExit() を別スレッドにする(一番変更コストは低そう)か、
そもそも待機しないようにするほうが良いでしょう。

もし、待機する必要がある(2個起動させないなど)なら、WaitForExitAsync() にして
非同期に終了待ちするようにしたうえで、再入防止フラグなどを用意して
待機中にもう一度呼び出ししないようにするなどの対応が必要だと思います。

Process.Start ではなく、Show() あるいは、ShowDialog() で表示しているということであれば
表示するタイミングで、タイマーを止めていないかを確認してください。

現状見せてもらったコードで言える範囲はこのくらいだと思います。
引用返信 編集キー/
■102819 / inTopicNo.8)  Re[4]: 非同期処理
□投稿者/ まさ (8回)-(2024/01/07(Sun) 20:28:55)
No102815 (furu さん) に返信
> ■No102813 (まさ さん) に返信
>> form1で1秒毎にデータを読込み折れ線グラフを表示させている時
>>form3を走らせるとform1の折れ線グラフが止まってしまします
> form3を走らせるところがありませんが
> どう走らせていますか?
> 
> form1を表示中form3を走らせるのに
> なぜform3でform1を作成(new Form1())しているのですか?


説明不足ですみません
form1からボタンでform2(メニュー画面)を表示させてグラフ表示のform3を選択しています
form3はグラフを作るためにデータを900万件読み込んでいます
そのデータを読み込んでいる為20秒前後かかってしまい、その間form1の棒グラフが動かなく
なってしまいました

form3はform2から下記で開いています
         private void btnForm3_Click(object sender, EventArgs e)
        {
            Form3 form3 = new Form3();
            form3.Show();
            this.Close();
        }

引用返信 編集キー/
■102820 / inTopicNo.9)  Re[5]: 非同期処理
□投稿者/ とっちゃん (807回)-(2024/01/07(Sun) 23:49:58)
No102819 (まさ さん) に返信
> ■No102815 (furu さん) に返信
>>■No102813 (まさ さん) に返信
> >> form1で1秒毎にデータを読込み折れ線グラフを表示させている時
> >>form3を走らせるとform1の折れ線グラフが止まってしまします
>>form3を走らせるところがありませんが
>>どう走らせていますか?
>>
>>form1を表示中form3を走らせるのに
>>なぜform3でform1を作成(new Form1())しているのですか?
>
>
> 説明不足ですみません
> form1からボタンでform2(メニュー画面)を表示させてグラフ表示のform3を選択しています
> form3はグラフを作るためにデータを900万件読み込んでいます
> そのデータを読み込んでいる為20秒前後かかってしまい、その間form1の棒グラフが動かなく
> なってしまいました
>
> form3はform2から下記で開いています
> private void btnForm3_Click(object sender, EventArgs e)
> {
> Form3 form3 = new Form3();
> form3.Show();
> this.Close();
> }
>
form3 のコンストラクタに form1 のインスタンスを渡すのでは?
まぁ、その部分はひとまず置いておくとして…


> form3はグラフを作るためにデータを900万件読み込んでいます
> そのデータを読み込んでいる為20秒前後かかってしまい、その間form1の棒グラフが動かなく
> なってしまいました

このデータを読み込んでいる間、UIスレッドがビジー状態になっています(何かしらのイベントハンドラが終了していない状態)。
System.Windows.Forms.Timer は、ウィンドウメッセージとして通知されます(マウスやキーボードなどの処理と同様)。
そのため、様々なイベントはできるだけ速やかに処理されなければなりません。

そのため、何らかのメソッドで時間がかかっているとメッセージが処理されず、タイマー通知が来なくなり
結果として、1秒ごとに処理されているはずなのに通知が来ないという状況になります。

すでに記載していますが、結論的な部分から言えば以下の3か所を非同期化する形にするのが取りこぼしなどは
少なくなるとおもいます(現行コードだと3の部分を非同期化した時点で、form1のCSV保存などでエラーメッセージが出ると思います)。


1. form1 でOpcServerから読み取る処理は、System.Threading.Timer などの非同期型を使う
2. CSVへの保存はファイルが開けない場合はリトライ処理を盛り込む(メッセージを出して止めてしまうのはNG)
3. form3 でCSVから読み取る部分も非同期化する

1, 2 についてはすでにざっくりとした形ですが、すでに記載してるので、3についても記載しておきます。

こちらは、day7() を非同期にすればよいと思います。

簡易的な非同期化であれば、以下のようにするだけでよいと思います。

await Task.Factory.StartNew( () => day7() );



ただし、Load() イベントの後半部分(line7()以降の部分)はday7() の処理が終わってから動くため
グラフが作られていない状態になります。

動かしてみないと画面が出てきてしまうかどうかわかりませんが、もし出てきてしまう場合は
グラフが出ていない状態が不具合ではなく、読み取り中だとわかるようにしておく必要があるかもしれません。

まぁ出てこなくても20秒も何も出てこない状態が続いていると(しかもグラフは動いている)
押し損ねた?と思われるので、どちらにしても工夫は必要になると思います。

引用返信 編集キー/
■102848 / inTopicNo.10)  Re[6]: 非同期処理
□投稿者/ takahiro (3回)-(2024/01/15(Mon) 22:01:25)
ありがとうございました
色々付けたしながら作ったプログラムで
よくわからなくなってきましたので
一旦整理させて頂いて宜しいでしょうか

1秒毎にデータを読み込んできて折れ線グラフで表示します
その間にdatagridviewなどを使うと折れ線グラフが止まってしまうので
集計だけ非同期でして集計結果を保存します
その集計結果をもとに棒グラフを書く
という流れではおかしいでしょうか
引用返信 編集キー/
■102849 / inTopicNo.11)  Re[7]: 非同期処理
□投稿者/ WebSurfer (2876回)-(2024/01/15(Mon) 22:11:48)
No102848 (takahiro さん) に返信

まさ = takahiro だね

捨垢&なりすましで何かいいことあるのでしょうか?
引用返信 編集キー/
■102850 / inTopicNo.12)  Re[8]: 非同期処理
□投稿者/ takahiro (4回)-(2024/01/15(Mon) 22:21:21)
No102849 (WebSurfer さん) に返信
> ■No102848 (takahiro さん) に返信
>
申し訳ありません。
何回も聞いたら悪いかなと思いまして
名前をかえさせて頂きました。すみません
引用返信 編集キー/
■102851 / inTopicNo.13)  Re[9]: 非同期処理
□投稿者/ WebSurfer (2877回)-(2024/01/15(Mon) 22:24:36)
No102850 (takahiro さん) に返信

利用規約を読みましたか?

> 一貫して同じハンドルを使用し、場を混乱させないようにしましょう。
> 同じハンドルの方が質問の背景がわかりやすいです (自作自演をしたり
> 別人を装うのは回答者の善意を裏切る行為です)。

「回答者の善意を裏切る行為」だと思わないのですかね。
引用返信 編集キー/
■102852 / inTopicNo.14)  Re[10]: 非同期処理
□投稿者/ takahiro (5回)-(2024/01/15(Mon) 22:33:41)
No102851 (WebSurfer さん) に返信
> ■No102850 (takahiro さん) に返信
>
申し訳ございません
途中で変えるつもりではなかったのですが
すみませんでした。お詫び申し上げます
引用返信 編集キー/
■102853 / inTopicNo.15)  Re[7]: 非同期処理
□投稿者/ とっちゃん (811回)-(2024/01/16(Tue) 11:33:42)
No102850 (takahiro さん) に返信
> 申し訳ありません。
> 何回も聞いたら悪いかなと思いまして
> 名前をかえさせて頂きました。すみません

前の質問を放置したまま、新たにスレッドを起こして
質問しまくるのなら、何回も聞いたら...となりますが
今は一つのやり取りをしてるので何度やり取りがあっても
それが問題になることはありません。
むしろ途中で名前が変わる(すなわち別の人になる)ほうが問題です。

誰かとお話してて、ちょっと目を離したすきに違う人になっていたらどう思いますか?
(これについては回答などは不要です)


ということで本題。

No102848 (takahiro さん) に返信
> ありがとうございました
> 色々付けたしながら作ったプログラムで
> よくわからなくなってきましたので
> 一旦整理させて頂いて宜しいでしょうか
>
> 1秒毎にデータを読み込んできて折れ線グラフで表示します
> その間にdatagridviewなどを使うと折れ線グラフが止まってしまうので
> 集計だけ非同期でして集計結果を保存します
> その集計結果をもとに棒グラフを書く
> という流れではおかしいでしょうか

ちょっときつい書き方になってしまいますが、
整理すべきは処理の流れではなく、やり取りの内容です。

この内容だと、何がやりたいのかをX(旧ツイッター)に書いただけで
ただの独り言と変わりません。

よくわからなくなったのであれば
これまでのやり取りで「わかったこと」と「わからなかったこと」を整理して下さい。

そのうえで、どうしたいのかを書く必要があります。

そうしないと回答側も何を書けばいいのかわかりませんし
何が伝わって、何が伝わらなかったのかもわかりません。

引用返信 編集キー/
■102861 / inTopicNo.16)  Re[7]: 非同期処理
□投稿者/ kiku (396回)-(2024/01/17(Wed) 11:03:01)
No102848 (takahiro さん) に返信
> ありがとうございました
> 色々付けたしながら作ったプログラムで
> よくわからなくなってきましたので
> 一旦整理させて頂いて宜しいでしょうか
> 
> 1秒毎にデータを読み込んできて折れ線グラフで表示します
> その間にdatagridviewなどを使うと折れ線グラフが止まってしまうので
> 集計だけ非同期でして集計結果を保存します
> その集計結果をもとに棒グラフを書く
> という流れではおかしいでしょうか

おそらくとっちゃんさんの■No102820の回答が
難しすぎて理解できないのではないかと想像しました。
回答の後半の方に具体的にどうすれば良いかも書かれてはいるのですが
もしかするとそこまで到達せずに、断念しているのではと思います。

単刀直入に質問者さんに実施して欲しいことだけを書くと
下記変更前のコードを、下記変更後コードに修正して
結果をこの掲示板に書いて欲しいです。
そうすれば回答が付くと思います。

・変更前コード
private void Form3_Load(object sender, EventArgs e)
        {
            day7();
            line7();
            lblDate.Text = "2000/00/00";
            lblTime.Text = "00:00:00";
        }

・変更後コード(修正箇所は2か所です。注意)
private async void Form3_Load(object sender, EventArgs e)
        {
            await Task.Factory.StartNew( () => day7() );
            line7();
            lblDate.Text = "2000/00/00";
            lblTime.Text = "00:00:00";
        }

引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ