none
ReportProgressを使用しても、ProgressChangedが動かない RRS feed

  • 質問

  • Visual CS 2010 Expressを使って、フォームアプリケーションの開発を行っています。
    現在、そのプロトタイプとなるフォームを制作しているのですが、ReportProgressメソッドを呼び出し、progressChangedイベントを発生させても、backgroundWorker1_ProgressChangedメソッドが動きません。
    解決のため、アドバイスをお願いいたします。また、申し訳ありませんが、私はC#にあまり詳しくありません。説明に不明瞭な点がございましたら、遠慮なくご指摘をお願いいたします。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    
    namespace TCP_recever
    {
      public partial class Form1 : Form
      {
    
        private string states = "";
        private string button1_Text = "";
        private string data = "";
    
        //現在使用せず
        private double delta = 0.0;
        private double theta = 0.0;
        private double low_beta = 0.0;
        private double high_beta = 0.0;
        private double low_alpha = 0.0;
        private double high_alpha = 0.0;
        private double low_gamma = 0.0;
        private double high_gamma = 0.0;
    
        public Form1()
        {
          InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs ev)
        {
    
        }
    
        //---------------------------
        // Method of button1_Click
        //---------------------------
        private void button1_Click(object sender, EventArgs ev)
        {
          msgBox01.Text = "connecting...";
          button1.Enabled = false;
          backgroundWorker1.RunWorkerAsync();
    
        }
    
        //----------------------
        // background process
        //----------------------
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs ev)
        {
    
          BackgroundWorker worker = (BackgroundWorker)sender;
    
    
          //ポートとアドレスを取得
          int port = int.Parse(portBox.Text);
          string adress = adressBox.Text;
    
          System.Net.Sockets.TcpClient tcp;
          System.Net.Sockets.NetworkStream ns;
    
          states += "connecting...\n";
    
          try
          {
            tcp = new System.Net.Sockets.TcpClient(adress, port);
            ns = tcp.GetStream();
          }
          catch(Exception e)
          {
            states += "Error in connection\n";
            ev.Result = "Error in Connection";
            MessageBox.Show(e.Message);
            return;
          }
    
          states += "---Message------\n";
          button1_Text = "切断";
    
          Byte[] bytes = new Byte[1024];
          int resSize;
    
          while(true){
    
            resSize = ns.Read(bytes,0,bytes.Length);
            if(resSize == 0){
              MessageBox.Show("Error : No data\n");
              break;
            }
    
            data = Encoding.GetEncoding(932).GetString(bytes);
    
            MessageBox.Show("try reportprogress\n");
            worker.ReportProgress(0);
            System.Threading.Thread.Sleep(60);
    
    
          }
    
          tcp.Close();
        }
    
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs ev)
        {
          MessageBox.Show("Progress Changed\n");
          msgBox01.Text += states;
          msgBox01.Text += data;
          msgBox01.Text += "\n";
          button1.Text = button1_Text;
        }
    
      }
    }
    
    
    2010年12月14日 15:28

回答

  • Form1 をデザイナーで表示してbackgroundWorker1 を選択し、プロパティでイベントの一覧を表示してみてください。ProgressChanged のところに backgroundWorker1_ProgressChanged の名前がありますか?

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    • 回答としてマーク VANLILY 2010年12月16日 12:21
    2010年12月15日 0:02

すべての返信

  • 確認なんですが、backgroundWorker1_ProgressChanged イベントハンドラは、backgroundWorker1 の ProgressChanged イベントにちゃんと設定されていますか?

    あと、backgroundWorker1 の WorkerReportsProgress プロパティは true になっていますか?

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年12月14日 21:32
  • backgroundWorker1 の WorkerReportsProgress プロパティは trueになっています。
    backgroundWorker1_ProgressChanged イベントハンドラを、backgroundWorker1 の ProgressChanged イベントに設定するには、どうすればよいのでしょうか?たいへん初歩的な質問で恐縮です。
    2010年12月14日 22:44
  • Form1 をデザイナーで表示してbackgroundWorker1 を選択し、プロパティでイベントの一覧を表示してみてください。ProgressChanged のところに backgroundWorker1_ProgressChanged の名前がありますか?

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    • 回答としてマーク VANLILY 2010年12月16日 12:21
    2010年12月15日 0:02
  • 発生している問題とは話がそれますが、BackgroundWorkerクラスのReportProgressメソッドのには

    第二引数にObject型を持つオーバーロードがあります。

    DoWorkイベントでprivateメンバに値を設定してProgressChangedイベントでそのメンバにアクセスする以外にも

    DoWorkイベントから呼び出すReportProgressメソッドの第二引数に、必要な値を渡す方法もあります。

    2010年12月15日 0:49
  • 返信が遅れ、たいへん申し訳ありません。なかむら様のおかげで無事に動作しました。
    皆様ご返答いただき、ありがとうございました。
    2010年12月16日 12:23