/// <summary> /// 在队列中增加一个消息 /// </summary> /// <param name="item"></param> public void Add(TIRAPOPCTagValueItem item) { lock (_lockObject) { queue.Enqueue(item); } }
public TOPCTagValueThread(TIRAPOPCTagValueItem item) { count++; AllThreadID++; threadID = AllThreadID; this.item = item; Debug.WriteLine(string.Format("创建线程对象,当前线程号[#{0}],一共有 [{1}] 个线程对象", threadID, count)); }
/// <summary> /// 每当项数据有变化时执行的事件 /// </summary> /// <param name="transactionID"></param> /// <param name="numItems"></param> /// <param name="clientHandles"></param> /// <param name="itemValues"></param> /// <param name="qualities"></param> /// <param name="timeStamp"></param> private void KepGroup_DataChange( int transactionID, int numItems, ref Array clientHandles, ref Array itemValues, ref Array qualities, ref Array timeStamp) { for (int i = 1; i <= numItems; i++) { try { string strValue = ""; int idxTagName = -1; idxTagName = int.Parse(clientHandles.GetValue(i).ToString()) - 1; if (idxTagName >= 0 && idxTagName < tags.Count) { if (itemValues.GetValue(i) != null) { strValue = itemValues.GetValue(i).ToString(); } TIRAPOPCTagValueItem item = new TIRAPOPCTagValueItem() { KepServerAddress = ipKepServer, KepServerName = nameKepServer, TagName = tags[idxTagName].TagName, Value = strValue, Quality = qualities.GetValue(i).ToString(), TimeStamp = timeStamp.GetValue(i).ToString(), ReceiveTime = DateTime.Now, }; //Console.WriteLine( // string.Format( // "[{0}]收到消息事件:TagName[{1}],Value[{2}],TimeStamp[{3}]", // DateTime.Now.ToString("HH:mm:ss.fff"), // item.TagName, item.Value, item.TimeStamp)); // 将收到的消息放入待处理消息队列中 //TIRAPOPCTagValueItemQueue.Instance.Add(item); //Debug.WriteLine( // string.Format( // "入队:TagName[{0}],Value[{1}],Quality[{2}],TimeStamp[{3}],共[{4}]条消息", // item.TagName, item.Value, item.Quality, item.TimeStamp, // TIRAPOPCTagValueItemQueue.Instance.QueueItemCount)); // 直接生成消息处理线程处理收到的消息 TOPCTagValueThread settleThread = new TOPCTagValueThread(item); Thread thread = new Thread(new ThreadStart(settleThread.Start)); thread.Start(); } } catch (Exception error) { //Debug.WriteLine(string.Format("入队时出错:[{0}]", error.Message)); Debug.WriteLine(string.Format("处理时出错:[{0}]", error.Message)); } } }
private void Settle() { Debug.WriteLine( string.Format( "[线程 #{0}]开始处理 OPC 出队消息", threadID)); TIRAPOPCTagValueItem value = TIRAPOPCTagValueItemQueue.Instance.Get(); while (!needStopped || value != null) { if (value != null) { Debug.WriteLine( string.Format( "[线程 #{0}]处理 OPC 出队消息:TagName:[{1}],Value:[{2}]", threadID, value.TagName, value.Value)); try { string fullTagName = string.Format( "{0}.{1}", value.KepServerName, value.TagName); Debug.WriteLine(string.Format("TagName:[{0}]", fullTagName)); TIRAPOPCTag tag = TIRAPOPCDevices.Instance.FindOPCTagItem(fullTagName); if (tag != null) { Console.WriteLine( string.Format( "[线程 #{0}]处理 OPC 出队消息:TagName:[{1}],Value:[{2}]", threadID, value.TagName, value.Value)); tag.SetTagValue(value.Value, value.TimeStamp); } else { Debug.WriteLine( string.Format( "KepTag:未注册[{0}]", fullTagName)); } } catch (Exception error) { string errCode = ""; string errText = ""; if (error.Data["ErrCode"] != null) { errCode = error.Data["ErrCode"].ToString(); } if (error.Data["ErrText"] != null) { errText = error.Data["ErrText"].ToString(); } else { errText = error.Message; } Debug.WriteLine( string.Format( "[线程 #{0}]处理消息时出错:[({1}){2}]", threadID, errCode, errText)); } } Thread.Sleep(10); value = TIRAPOPCTagValueItemQueue.Instance.Get(); } Debug.WriteLine("[线程 #[{0}]已停止。", threadID); }