Ejemplo n.º 1
0
        // 这里确实有个多线程的问题,不知道到底用到了几个线程,需要解决多线程的问题吗?
        // http://stackoverflow.com/questions/4876414/how-to-prevent-system-timers-timer-from-queuing-for-execution-on-a-thread-pool#
        private void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
        {
            if (opcClient.Connected == false)
            {
                try
                {
                    opcClient.Disconnect();
                    bool result = opcClient.Connect();
                    if (result)
                    {
                        if (opcClient.Connected != false)
                        {
                            // 添加Tags,AddTags

                            //opcClient.AddTags1(keyTagMap);
                            AddTagsDelegate worker      = AddTagsWorker;
                            IAsyncResult    asyncResult = worker.BeginInvoke(AddTagsCompleted, worker);
                            //this.treeListView.BeginInvoke(new AddTagsDelegate(AddTagsWorker1));
                        }
                        else
                        {
                        }
                    }
                }
                catch (Exception ex)
                {
                    // 这里Catch 一个  System.Threading.ThreadAbortException,看起来已经catch了。
                    aTimer.Enabled = true;
                }
            }
            else
            {
                try {
                    Console.WriteLine();

                    if (this.treeListView.InvokeRequired)
                    {
                        //this.treeListView.Invoke((MethodInvoker) delegate { DoRereshTreeList(); });
                    }
                    else
                    {
                        //this.treeListView.Refresh();
                    }
                } catch (Exception ex)
                {
                }
            }

            aTimer.Enabled = true;
        }
Ejemplo n.º 2
0
 ///////////////////////////////////////////////////////////////////////////////////////////
 /// <summary>
 /// Add a batch of tags to the opc server
 /// </summary>
 /// <param name="tags"></param>
 ///////////////////////////////////////////////////////////////////////////////////////////
 public void AddTags1(SortedDictionary <string, OPCTag> opcTags, string groupName = null, bool removeFormer = false)
 {
     Console.WriteLine("in OPCClient, AddTags1, Thread id is: " + System.Threading.Thread.CurrentThread.ManagedThreadId);
     AddTagsDelegate worker      = AddTagsWorker;
     IAsyncResult    asyncResult = worker.BeginInvoke(opcTags, groupName, removeFormer, AddTagsCompleted, worker);
 }
Ejemplo n.º 3
0
        /// <summary>
        /// 【按钮】连接OPC服务器
        /// </summary>
        private void btnConnLocalServer_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.btnConnServer.Text == "连接")
                {
                    if (String.IsNullOrEmpty(this.txtRemoteServerIP.Text))
                    {
                        this.txtRemoteServerIP.Text = "127.0.0.1";
                    }

                    opcClient.Initialize(cmbServerName.Text, this.txtRemoteServerIP.Text);

                    bool result = opcClient.Connect();
                    if (!result)
                    {
                        // 在这里处理连接错误
                        MessageBox.Show("不能连接到OPC Server:" + cmbServerName.Text, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return;
                    }

                    this.btnConnServer.Enabled = false;

                    // 启动Timer,去定时坚持是否连接正常
                    aTimer          = new System.Timers.Timer();
                    aTimer.Interval = 1000;

                    // Alternate method: create a Timer with an interval argument to the constructor.
                    //aTimer = new System.Timers.Timer(2000);

                    // Create a timer with a two second interval.
                    //aTimer = new System.Timers.Timer(5000);

                    // Hook up the Elapsed event for the timer.
                    aTimer.Elapsed += OnTimedEvent;

                    // Have the timer fire repeated events (true is the default)
                    aTimer.AutoReset = false;

                    // Start the timer
                    aTimer.Enabled = true;

                    TextOverlay textOverlay = this.treeListView.OverlayText as TextOverlay;
                    textOverlay.Alignment   = System.Drawing.ContentAlignment.MiddleCenter;
                    textOverlay.TextColor   = Color.Firebrick;
                    textOverlay.BackColor   = Color.AntiqueWhite;
                    textOverlay.BorderColor = Color.DarkRed;
                    textOverlay.BorderWidth = 4.0f;
                    textOverlay.Font        = new Font("宋体", 36);
                    //textOverlay.Rotation = -5;
                    textOverlay.Text = "正在加载Tag...";
                    this.treeListView.RefreshOverlays();


                    if (!treeInitialized)
                    {
                        InitializeTree();
                    }


                    // 添加Tags,AddTags

                    //opcClient.AddTags1(keyTagMap);
                    AddTagsDelegate worker      = AddTagsWorker;
                    IAsyncResult    asyncResult = worker.BeginInvoke(AddTagsCompleted, worker);
                    //this.treeListView.BeginInvoke(new AddTagsDelegate(AddTagsWorker1));

                    this.btnConnServer.Text = "断开";
                }
                else
                {
                    aTimer.Enabled = false;
                    aTimer         = null;

                    Thread.Sleep(1000);
                    if (opcClient.Connected == true)
                    {
                        opcClient.Disconnect();
                    }

                    // 这样行不行?
                    // 显然不够,因为还得加 Column 类的
                    //this.treeListView = new BrightIdeasSoftware.TreeListView();
                    //this.treeListView.Clear();
                    this.treeListView.ClearObjects();
                    Thread.Sleep(1000);
                    treeInitialized = false;
                    keyTagMap.Clear();
                    rootTagMap.Clear();
                    allTagNames.Clear();
                    seqId = 1;

                    lastTag = null;
                    this.btnConnServer.Text     = "连接";
                    this.ExpandAllNodes.Enabled = false;
                    this.ExpandAllNodes.Text    = "全部展开";
                }
            }

            catch (Exception err)
            {
                MessageBox.Show("初始化出错:" + err.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }