1

ネットワーク上のさまざまなデバイスのステータスを監視するプログラムを作成しています。これらのデバイスの詳細はファイルに保存されます。HandleClientComm クラスは、これらのデバイスに関する情報をファイルから読み取り、それらとの tcp 接続を確立します。ファイルが読み取られた後、manEvent が通知に使用されます。UpdateGUI 関数は、デバイスごとに呼び出されます。data.caller が 1 の場合、そのデバイスのコントロールが追加されますが、グループ ボックスは無効になります。関数 hd.StartThreads は、Threadpool を使用してさまざまなデバイスからの接続をリッスンします。接続が受け入れられると、UpdateGUI 関数が data.caller 値 2 で再度呼び出されます。私の問題は、グループボックスが有効になっていないことです。メッセージ ボックスに「begin」と表示されますが、終了しません。グループボックス以外の他のコントロールにアクセスしようとしましたが、しかし、そこからどのコントロールにもアクセスできないことがわかりました。コードで無限ループが実行されていないため、メッセージ ループに問題がありますか?

namespace FA
{
  public partial class EditDevice : Form
  {
      public struct DisplayComponents
      {
          public GroupBox gp;
          public List<Panel> labelPanel;
          public List<FlowLayoutPanel> picPanel;
          public List<Label> LabelList;
          public List<PictureBox> Pics;
          public Label Mid, Date, Time;
          public int gpHeight, gppt;
      };
      public DisplayComponents[] comps;
      private DeviceList[] dev;
      private ManualResetEvent manEvent;
      private int devCount;
      private HandleClientComm hd;

      public EditDevice()
      {
          InitializeComponent();
          //Create event to notify whether device file has been read
          manEvent = new ManualResetEvent(false);
          //Create object of the client communication class
          hd = new HandleClientComm(manEvent);
          //wait for the file read notification
          manEvent.WaitOne();
          //get the device count
          devCount = hd.devCount;
          //get the device details
          dev = hd.dv; 
          initializeForm();
          //Add event handler for device status change
          hd.StatusChanged += new HandleClientComm.StatusChangeHandler(UpdateGUI);
          //Start thread to monitor device status
          Thread th = new Thread(hd.StartThreads);
          th.Start();
          th.Join();
      }

       public void initializeForm()
      {
          //Create components
          comps = new DisplayComponents[hd.devCount];
          // Groupbox initial point
          int gppt = 40;
          //Calculate Groupbox point and heights for each devices
          for (int i = 0; i < devCount; i++)
          {
              comps[i].gpHeight = 60;
              comps[i].gpHeight = comps[i].gpHeight + (dev[i].Zones / 21) * 77;
              if (dev[i].Zones % 21 != 0)
                  comps[i].gpHeight += 77;
              comps[i].gppt = gppt;
              gppt += comps[i].gpHeight+10;
          } 
      }

      private void UpdateGUI(object sender, StatusChangeEventArgs data)
      {
          if (data.caller == 1)
          {
              //Function to add controls to the form
              addDeviceControls(data.index);
          }
          else
          {
              MessageBox.Show("begin");
              comps[data.index].gp.Enabled = true;
              MessageBox.Show("end");
          }
      }
   }

 public class StatusChangeEventArgs : EventArgs
  {
      public int index { get; internal set; }
      public int caller { get; internal set; }

      public StatusChangeEventArgs(int index1, int callno)
      {
          this.index = index1;
          this.caller = callno;
      }
  }
}
4

1 に答える 1

0

あなたのHandleClient.Comm.StatusChangehandler(UpdateGUI);呼び出しがエラーを消費しているか、より高いレベルの何かがエラーをキャッチしているようです。コードのポインティングとステップ実行を中断しようとしましたか?

別のスレッドからコントロールを更新するには、メイン スレッドで変更を呼び出す必要があります。

もっと役立つかもしれないので、この質問を見てください。C#で別のスレッドからGUIを更新するには?

WPF を使用している場合は、少し異なる方法で行われ、更新するために Dispatcher.Invoke を呼び出す必要があります。

これがお役に立てば幸いです。知らないうちにエラーが消費されているように聞こえます。

于 2012-11-06T07:56:17.403 に答える