/// <inheritdoc /> /// <summary> /// 初始化 <see cref="ChooseDevice" /> 窗口。 /// </summary> /// <param name="index">用于回传设备选项的编号。</param> public ChooseDevice(ref PointerPacker index) { InitializeComponent(); _index = index; // 设置鼠标悬停弹出窗口参数 _deviceListTooltip.AutoPopDelay = 5000; _deviceListTooltip.InitialDelay = 1000; _deviceListTooltip.ReshowDelay = 500; // 获取设备信息 CheckForIllegalCrossThreadCalls = false; new Thread(getDeviceInfo => { var collection = new List<string>(); foreach (var dev in CaptureDeviceList.Instance) { var devInterface = ((WinPcapDevice) dev).Interface; collection.Add(devInterface.FriendlyName ?? devInterface.Name); _devName.Add(dev.Name); var buf = dev.ToString(); buf = buf.Replace("\n\n", "\n"); buf = buf.Replace("\n", "\r\n"); _deviceListInfo.Add(buf); } lock (DeviceList) { foreach (var str in collection) DeviceList.Items.Add(str); DeviceList.Enabled = true; } CheckForIllegalCrossThreadCalls = true; }).Start(); }
/// <summary> /// 启动指定的模块。 /// </summary> /// <param name="models">需要启动的模块列表。</param> /// <returns>成功返回true,错误返回false。</returns> private static bool StartupModels(IEnumerable <BasicClass> models) { // 判断模块是否初始化 var modelsList = models.ToList(); if (modelsList.Contains(null)) { return(false); } // 选择设备 var index = new PointerPacker(""); var chooseDevice = new ChooseDevice(ref index); while (true) { chooseDevice.ShowDialog(); // 用户点击了取消,中止本次操作 var value = (string)index.Item; if (value.Length == 0) { return(true); } // 检查设备网络是否有效 var device = (WinPcapDevice)CaptureDeviceList.Instance[value]; var isValid = false; foreach (var address in device.Addresses) { if (address.Addr.sa_family != 2) { continue; } isValid = true; break; } if (isValid) { break; } var dialogResult = MessageBox.Show("无法确定指定设备的IPv4网络环境,仍然继续?", "警告", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); if (dialogResult == DialogResult.OK) { break; } } // 创建载入界面 var task = new Thread(init => { try { foreach (var model in modelsList) { model.CurDevName = index.Item.ToString(); } } catch (ThreadAbortException) { foreach (var model in modelsList) { model.CurDevName = ""; } } }) { Name = RegisteredThreadName.StartupModels.ToString() }; MessagePipe.SendInMessage(new KeyValuePair <Message, Thread>(Message.TaskIn, task)); var loading = new Loading("设置模块中,请稍候", task); loading.ShowDialog(); // 等待结果 var result = Message.NoAvailableMessage; new WaitTimeoutChecker(30000).ThreadSleep(500, () => (result = MessagePipe.GetNextOutMessage(task)) == Message.NoAvailableMessage); // 用户取消 if (result == Message.UserCancel) { MessagePipe.SendInMessage(new KeyValuePair <Message, Thread>(Message.TaskCancel, task)); new WaitTimeoutChecker(30000).ThreadSleep(500, () => (result = MessagePipe.GetNextOutMessage(task)) == Message.NoAvailableMessage); switch (result) { case Message.TaskAborted: return(false); case Message.TaskOut: break; case Message.TaskNotFound: MessageBox.Show("未能找到指定名称的工作线程。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return(false); default: throw new Exception($"无效的消息类型:{result}"); } } // 任务完成 MessagePipe.ClearAllMessage(task); return(true); }