ネットワーク上のさまざまなデバイスのステータスを監視するプログラムを作成しています。これらのデバイスの詳細はファイルに保存されます。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;
}
}
}