Exemplo n.º 1
0
        /// <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();
        }
Exemplo n.º 2
0
        /// <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);
        }