C#でリアルタイムに処理結果を表示する方法

このQ&Aのポイント
  • C#で処理結果をリアルタイムに表示させる方法について説明します。現在、visual C#を勉強中で時間のかかる処理を作っている際に、結果が表示されないことに困っています。forやforeachのループ内でデータを表示する方法や一時停止する方法についても解説します。
  • C#でリアルタイムに処理結果を表示させる方法について説明します。時間のかかる処理を作成している際に、すべての結果を待たずに逐次表示させたい場合は、forやforeachのループ内でデータを表示することができます。また、処理途中で一時停止するためには、適切な制御文を利用する必要があります。
  • C#で処理結果をリアルタイムに表示させる方法について説明します。時間のかかる処理を作成している場合でも、forやforeachのループ内でデータを逐次表示させることが可能です。また、処理途中で一時停止するためには、適切な条件文を利用することが重要です。
回答を見る
  • ベストアンサー

C#の処理をリアルタイムに表示させる方法

いつもありがとうございます。 現在、visual C#を勉強中で、とても初歩的なことを聞いてしまうかもしれませんが、 よろしくお願いします。 かなり時間がかかる処理を作っているのですが、 すべて終わるまでツールが結果を表示してくれなくて困っています。 forやforeachのループを1回回るごとに データを表示させることは可能でしょうか? また処理途中で一時停止したいです。 具体的には、listviewにデータを表示させています。 たとえば以下のような処理ですが、すべ終わって結果が 表示されるのは、1個ずつリアルタイムにリストビューに 追加されていき・・・ さらに途中で一時停止をしたいと考えています。 for (int i=0; i<10000; i++) { 処理して得られたデータを listView1.Items.Add(データ); と追加 } 以上よろしくお願いします。

  • macus
  • お礼率76% (331/433)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

とりあえず,一番簡単そうなのは ・イベントハンドラをasyncにする ・処理部分をasyncなメソッドに切り出す ・処理部分をawaitつきで呼び出す 方法でしょうか (VS 2012以降)。 または,.NET Framework 2.0以降用ですが,BackgroundWorkerを貼り付けて, ・WorkerReportsProgressプロパティをTrueにする ・DoWorkイベントデータ処理コードを書き,ループごとにReportProgressを呼び出す ・ProgressChangedイベントでデータをlistView1に設定する というのもありだと思います。 一時停止は,UIから要求するものの場合だと,ManualResetEventのインスタンスを用意して,最初にSetしておき, ・処理部分の最初でWaitメソッドを呼び出す ・一時停止を要求するタイミングでResetメソッドを呼び出し,解除するタイミングでSetメソッドを呼び出す で対処できます。 ANo.2さんの書かれているApplication.DoEventsは,長時間処理の対策として推奨されません。 MSDN: Application.DoEvents メソッド (System.Windows.Forms) http://msdn.microsoft.com/ja-jp/library/system.windows.forms.application.doevents(v=vs.100).aspx ※解説の「注意」を参照。

macus
質問者

お礼

Application.DoEventsは長時間処理だとダメなんですね! ありがとうございます。

その他の回答 (3)

  • IDii24
  • ベストアンサー率24% (1597/6506)
回答No.3

開発途中で確認したいのではなく、そういう機能を持たせたいという事なんでしょうか?でしたら割り込み処理を調べてください。ボリューム的にここでは難しいです。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

一時停止用にチェックボックスを追加します カウント中断用の変数をフォームクラスに追加します ... bool bFlag; FormClosingイベントで bFlag = True; として カウント中断の判断とします カウントアップイベントで for ( int i =0; i < 10000; i++ ) {   ListView1.Items.Add(データ);   do   {     // Windowsに未処理のメッセージを処理させる     Application.DoEvents();     // 自処理でCPUを占有しないようにするため     System.Threading.Thread.Sleep(10);     // カウント中断の判定     if ( bFlag )       return;   }   while(checkBox1.checked); } といった具合で …

macus
質問者

お礼

お返事ありがとうございます。 やってみたのですが・・・ 処理中はフォーム自体を触ることができませんでした。。。

macus
質問者

補足

すみません。私の勘違いでした。 リアルタイム表示&一時停止が出来ました!! ありがとうございます!!!

  • IDii24
  • ベストアンサー率24% (1597/6506)
回答No.1

古くからやるのはconsolewritelineで値をコンソールあるいは出力ペインに出力させる。 出も面倒なので、デバックし、ステップ実行をする方が楽。 F11でステップ実行する。長い処理の場合ずっとF11押すのは大変。途中で止めたい場所。たぶん } の行の先頭のスペースをクリックすると赤い丸が付く。 F5を押すとプログラムはステップではなく続行されるがその赤い丸(ブレークポイント)で止まる。 その時の値は見たい変数にカーソルをあてると階層でみれる。 またすべての値をみるにはローカルビューを見る。メニューのデバックのなかにローカルって画面がある。 読み込まれたすべての格納情報が見れる。F5を押すたびにそこで止まる。赤い丸はもう一度クリックで解除される。

macus
質問者

お礼

ご回答ありがとうございます。 自動で処理していきたいため、何か操作をせずに リアルタイムに表示してほしいです。 リアルタイムにデータが表示されていって、 たまに観た時に、気になるデータがあったら 一時停止して観るみたいな感じにしたいです。 よろしくお願いします。

関連するQ&A

  • ListViewにて行追加

    Visual C# 2005初心者です。 ListViewを使用して、データを表示するのに、 listView1.Items.Add("1111111", 3); listView1.Items.Add("2222222", 3); listView1.Items.Add("3333333", 3); と書くと、列が追加されます。 行を追加するには、どうすればよいのでしょうか? どうか、教えてください。

  • VB2008でリストを横に表示させたい

    ListViewで下記のように横表示させたいです。  年  | 月 |  学歴   | 平成04  3   小学校卒業 平成07  3   中学校卒業 下記のソースでためしたのですが、改行されてすべて縦に表示されてしまいます。 ListView1.Items.Add("平成04") ListView1.Items.Add("3") ListView1.Items.Add("小学校卒業" & vbCrLf) ListView1.Items.Add("平成07") ListView1.Items.Add("3") ListView1.Items.Add("中学校卒業" & vbCrLf) お手数ですが何かアドバイスお願いします。

  • ストアアプリ開発 C# ListViewについて

    ストアアプリ開発 C#初心者です。 サーバーからデータ取得後、 ListViewにデータを追加したいのですがよくわかりません。 ListViewに表示させたいのは日付、タイトル、画像です。 xaml↓ <ListView Grid.Row="1" x:Name="ListView1"></ListView> C# foreach (var item in blog_list){ ListViewItem addItem = new ListViewItem(); addItem.Tag = item.GetObject().GetNamedString("id"); addItem.Content = item.GetObject().GetNamedString("name"); ListView1.Items.Add(addItem); } 本当に初心者で申し訳ないのですがわかりやすい 解説等してるサイトありましたら教えてください。

  • ListViewで条件式を使う方法

    Visual Basic 2010でDatasetとListviewを使ってプログラムを作成しています。 DatasetのデータをListviewに表示させるプログラムは下記のコードで完成しました。 ******************************* Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With ListView1 .Columns.Add("date", 40, HorizontalAlignment.Left) .Columns.Add("no", 40, HorizontalAlignment.Left) .Columns.Add("住所", 100, HorizontalAlignment.Left) showlist() End With End Sub Private Sub showlist() Try 住所TableAdapter.Fill(Kz526DataSet.住所) Catch ex As Exception MessageBox.Show(ex.Message, "住所テーブル") End Try With Kz526DataSet.住所 For i As Integer = 0 To .Rows.Count - 1 ListView1.Items.Add(.Rows(i)("date"), (i)) ListView1.Items(i).SubItems.Add(.Rows(i)("no")) ListView1.Items(i).SubItems.Add(.Rows(i)("住所")) Next End With End Sub ************************************ 次に、Datasetのデータの内一部だけListviewに表示させることにしました。そのため、テキストボックスを設けて、その日付と同じデータをListviewに表示させます。 テキストボックスを設けて、ボタンをクリックしてデータをListviewに表示させようとしたコードです。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With ListView1 .Columns.Add("date", 40, HorizontalAlignment.Left) .Columns.Add("no", 40, HorizontalAlignment.Left) .Columns.Add("住所", 100, HorizontalAlignment.Left) showlist() End With End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 住所TableAdapter.Fill(Kz526DataSet.住所) With Kz526DataSet.住所 For c As Integer = 0 To .Rows.Count - 1 If TextBox1.Text = Kz526DataSet.住所.Rows(c)("data") Then ListView1.Items.Add(.Rows(c)("date"), (c)) ListView1.Items(c).SubItems.Add(.Rows(c)("no")) ListView1.Items(c).SubItems.Add(.Rows(c)("住所")) End If Next End With End Sub *************************************** このコードでは、条件式とListViewの関係がいまくいきません。エラーメッセージは次の様に表示されます。 「'3' の InvalidArgument=Value は 'index' に対して有効ではありません。 パラメーター名: index」 いろいろ試行錯誤してみましたところ、「ListView1.Items(c).SubItems.Add(.Rows(c)("no"))」のところで止まります。 if文では、Thenのあとは1行しか書けないのでしょうか。書き方をご指導ください。

  • ListViewコントロールでサムネイル画像を一覧表示するには?

    VB初心者です。 .NET TIPSの中に「ListViewコントロールでサムネイル画像を一覧表示するには?」というものがありました 今回、それを利用してサムネイル一覧の表示をしようとして行き詰りました。 作りたいのは以下のものです ○決まったサイズの画像(bitmap)を表示し、その下にファイル名(フルパスでは無い)を表示し、更にその下に元の画像のサイズを表示するようなものを作成したいのですが、作成可能でしょうか? また、作成可能な場合、どういった方法で作成したら良いか教えて下さい。 行き詰ったのは、第一段階の、サムネイル画像のしたのファイル名の所です。 よく分からずに ListView1.Items.Add(bmpFiles(i), i)の所を Dim bmpFileName As String = _ Path.GetFileNameWithoutExtension(bmpFiles(i)) ListView1.Items.Add(bmpFileName) bmpFileName(ファイル名のみ)に変更したら、ファイル名は表示されるのですが、画像が表示されませんでした。 次に両方書いたのですが画像の下にフルパスその横にファイル名が表示されます。 Dim bmpFileName As String = _ Path.GetFileNameWithoutExtension(bmpFiles(i)) ListView1.Items.Add(bmpFiles(i), i) ListView1.Items.Add(bmpFileName) 色々調べてみたのですが、思ったような記述が無かったのでここで質問させて頂きました。 拙い質問なので分かり難いかと思いますがアドバイスをよろしくお願いいたします。

  • IE8でのPHPの処理の途中結果表示方法について

    PHPの処理の途中結果を表示させようとして、下記ブラウザで結果を確認しました。 -処理内容- for($i = 0;$i<10;$i++){ ~とある処理~ ob_flush(); flush(); } --- ・Firefox ・Google Chrome  ・Internet Explorer 8(以下IE8) IE8以外だと想定通りの結果が表示されますが、IE8のみ、全ての処理が完了してから、表示されます。 Googleで検索した所、IE(IE8かどうかは不明)だと256バイトの出力を受けてからページを表示し始める、と書いてあったので、下記処理を追加しました。 参考:http://php.net/manual/ja/function.flush.php -処理内容- for($i = 0;$i<10;$i++){ ~とある処理~ for($ie = 0;$ie<256;$ie++){ echo ' '; } ob_flush(); flush(); } --- しかし、結果は変わりませんでした。 IE8で、PHPの処理の途中結果を表示させる方法についてアドバイス頂けないでしょうか。 宜しくお願い致します。

    • 締切済み
    • PHP
  • 一行ずつリアルタイムに結果を表示したい

    cgiプログラムで print "<html><body>"; foreach(0..1000000000000){ $n++; print "$n<br>\n"; } print "</body></html>"; というかんじで結果を出力しようとすると 出力の際、処理されたところまでいったん表示され 何分かたってまた、処理されたところまでを表示されます。 例)1~10000表示→3分後に10001~20000を表示 これでは10001が処理できているのかが3分後にならないとわかりません。 そのため出力結果を一行ずつリアルタイムに表示できるようにしたいのですが、 どのように処理したら良いでしょうか? お教え下さい。よろしくお願いします。

    • ベストアンサー
    • CGI
  • ListViewで処理経過表示

    ListViewを使って処理の経過を表示する機能を作っています。例えば ***** Start ***** 001 処理1の開始 002 処理1の終了 003 処理2の開始 004 処理2の終了 005 処理3の開始 006 処理3の終了 ***** End ***** のような感じです。全て表示し終わると完了メッセージを表示し画面は閉じます。 処理件数が多くなるとListViewの見えない部分にデータが追加され、処理経過が分かりません。処理を追加しながら常にスクロールを下に移動する方法をお分かりの方がいましたらよろしくお願いします。

  • VB2010 ListView 使い方

    VB2010でListViewを使っています。かなり順調にプログラムが出来ているのですが、トラブルに遭遇しました。 Form1でDATAを入力して、Form2とForm3でそのDATAをListViewを使って表示しています。 そして、Form2のListViewをForm4に簡素化した雛形にして、ListViewを使って表示させています。 同様に、Form3のListViewをForm5に簡素化した雛形にして、ListViewを使って表示させています。 Form2からForm4は問題なく表示されますが、Form3からForm5はエラーとなります。 エラーは次のところで生じます。 ListView1.Items(2).SubItems.Add(Form3.ListView1.Items(1).SubItems(2)) エラーメッセージは次のようです。 「'1' の InvalidArgument=Value は 'index' に対して有効ではありません。」 また、次のようにコーディングしてみると、 ListView1.Items(2).SubItems.Add(Form3.Label2.Text) 「Labl2」と表示されるだけです。Label2の情報は表示されません。 単純にDATAを移すだけなのに、1つは出来て、もう1つは出来ないというのが分かりません。 どこに問題があるのでしょうか。 かなり悩んでいますが、解決策が見出せません。 ご教授いただける方が居られましたら、宜しくお願い申し上げます。

  • VB.NETでフォーム間でのコントロールの参照

    VB.NETでフォーム間でのコントロールの参照が うまくいかず困っています Windows フォーム Form1とForm2があります Form1にはリストビュー(name:ListView1)を配置しています Form1_LoadイベントでListView1にアイテムを追加します Form2を表示し、Form1のListView1のアイテム数を、 取得しようとすると 0 になってしまします どうすればForm2から取得できるのでしょうか? 次のように書いています Form1_Load イベント内 ListView1.Items.Add("Item1") ListView1.Items.Add("Item2") ListView1.Items.Add("Item3") MessageBox.Show(CStr(ListView1.Items.Count), "Form1") Dim Form2 As New Form2() Form2.Show() Form2_Load イベント内 Dim Form1 As New Form1() MessageBox.Show(CStr(Form1.ListView1.Items.Count), "Form2")

専門家に質問してみよう