Commit eb024034 authored by wangjunqiang's avatar wangjunqiang

添加线程监控

parent 634de4fb
...@@ -316,5 +316,15 @@ namespace GcDevicePc ...@@ -316,5 +316,15 @@ namespace GcDevicePc
} }
} }
public void StartDataThread()
{
if (!String.IsNullOrEmpty(globaldata.connection_ip))
{
MoudbusOperation.GetInstance().SetModbusIP(globaldata.connection_ip);
ThreadMonitor.GetInstance().StartALLCommunication();
ThreadMonitor.GetInstance().MonitorThStart();
}
}
} }
} }
This diff is collapsed.
...@@ -19,8 +19,7 @@ namespace GcDevicePc ...@@ -19,8 +19,7 @@ namespace GcDevicePc
public Thread updateth; public Thread updateth;
// GcDataReq m_data; // GcDataTh mymodbus;
GcDataTh mymodbus;
public DataState() public DataState()
{ {
...@@ -34,8 +33,8 @@ namespace GcDevicePc ...@@ -34,8 +33,8 @@ namespace GcDevicePc
{ {
try try
{ {
if (mymodbus != null) // if (mymodbus != null)
mymodbus.ShowDataStop(); // mymodbus.ShowDataStop();
} }
catch (Exception e) catch (Exception e)
{ {
...@@ -48,8 +47,8 @@ namespace GcDevicePc ...@@ -48,8 +47,8 @@ namespace GcDevicePc
{ {
try try
{ {
if (mymodbus != null) // if (mymodbus != null)
mymodbus.ShowDataStop(); // mymodbus.ShowDataStop();
} }
catch (Exception e) catch (Exception e)
{ {
...@@ -67,11 +66,9 @@ namespace GcDevicePc ...@@ -67,11 +66,9 @@ namespace GcDevicePc
globaldata.m_profileMethod.GetDevState(); globaldata.m_profileMethod.GetDevState();
if (!String.IsNullOrEmpty(globaldata.connection_ip)) if (!String.IsNullOrEmpty(globaldata.connection_ip))
{ {
//m_data = new GcDataReq(globaldata.connection_ip, globaldata.datamodbusport);
//m_data.Start();
mymodbus = new GcDataTh(globaldata.connection_ip, globaldata.datamodbusport); //mymodbus = new GcDataTh(globaldata.connection_ip, globaldata.datamodbusport);
mymodbus.ShowDataStart(); //mymodbus.ShowDataStart();
System.Windows.Forms.Timer T = new System.Windows.Forms.Timer(); System.Windows.Forms.Timer T = new System.Windows.Forms.Timer();
T.Interval = 100; T.Interval = 100;
......
...@@ -203,6 +203,7 @@ ...@@ -203,6 +203,7 @@
<Compile Include="Common\FileHelper.cs" /> <Compile Include="Common\FileHelper.cs" />
<Compile Include="Common\GCModbusSlave485.cs" /> <Compile Include="Common\GCModbusSlave485.cs" />
<Compile Include="Common\Log.cs" /> <Compile Include="Common\Log.cs" />
<Compile Include="Common\MoudbusOperation.cs" />
<Compile Include="Common\RunTableHelper.cs" /> <Compile Include="Common\RunTableHelper.cs" />
<Compile Include="Common\SendDataToHW.cs" /> <Compile Include="Common\SendDataToHW.cs" />
<Compile Include="ConfigDlg\ChromeDlg.cs"> <Compile Include="ConfigDlg\ChromeDlg.cs">
...@@ -480,12 +481,16 @@ ...@@ -480,12 +481,16 @@
<Compile Include="Program.cs" /> <Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ProThread\ChannelDataSave.cs" /> <Compile Include="ProThread\ChannelDataSave.cs" />
<Compile Include="ProThread\ChannelDataTh.cs" />
<Compile Include="ProThread\CKvocUpdata.cs" /> <Compile Include="ProThread\CKvocUpdata.cs" />
<Compile Include="ProThread\DataOutput.cs" /> <Compile Include="ProThread\DataOutput.cs" />
<Compile Include="ProThread\DataRcv.cs" /> <Compile Include="ProThread\DataRcv.cs" />
<Compile Include="ProThread\DisplayDataTh.cs" />
<Compile Include="ProThread\GcDataTh.cs" /> <Compile Include="ProThread\GcDataTh.cs" />
<Compile Include="ProThread\HMIControl.cs" /> <Compile Include="ProThread\HMIControl.cs" />
<Compile Include="ProThread\HMISearch.cs" /> <Compile Include="ProThread\HMISearch.cs" />
<Compile Include="ProThread\HmiStatueTh.cs" />
<Compile Include="ProThread\ThreadMonitor.cs" />
<Compile Include="QuitForm.cs"> <Compile Include="QuitForm.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>
......
...@@ -755,9 +755,9 @@ namespace GcDevicePc ...@@ -755,9 +755,9 @@ namespace GcDevicePc
statestr = "设备联机"; statestr = "设备联机";
IsStateColor=true; IsStateColor=true;
hmiopt = null;
hmiopt = new HMIControl(globaldata.connection_ip, globaldata.datamodbusport); hmiopt = new HMIControl(globaldata.connection_ip, globaldata.datamodbusport);
mymodbus = null;
mymodbus = new GcDataTh(globaldata.connection_ip, globaldata.datamodbusport); mymodbus = new GcDataTh(globaldata.connection_ip, globaldata.datamodbusport);
...@@ -800,8 +800,8 @@ namespace GcDevicePc ...@@ -800,8 +800,8 @@ namespace GcDevicePc
// mydatasave.ChannelDataStart(); // mydatasave.ChannelDataStart();
if (!String.IsNullOrEmpty(globaldata.connection_ip)) if (!String.IsNullOrEmpty(globaldata.connection_ip))
{ {
mymodbus.HmiStatueStart(); // mymodbus.HmiStatueStart();
mymodbus.ChannelDataStart(); // mymodbus.ChannelDataStart();
} }
dataVOC.CKvocUpdataStart(); dataVOC.CKvocUpdataStart();
...@@ -820,8 +820,10 @@ namespace GcDevicePc ...@@ -820,8 +820,10 @@ namespace GcDevicePc
if (!String.IsNullOrEmpty(globaldata.connection_ip)) if (!String.IsNullOrEmpty(globaldata.connection_ip))
{ {
mymodbus.HmiStatueStop(); // mymodbus.HmiStatueStop();
mymodbus.ChannelDataStop(); // mymodbus.ChannelDataStop();
ThreadMonitor.GetInstance().MonitorThStop();
ThreadMonitor.GetInstance().StopALLCommunication();
} }
if (!String.IsNullOrEmpty(globaldata.m_pcbuffer.gcpcinfo.moduleinfo.ip)) if (!String.IsNullOrEmpty(globaldata.m_pcbuffer.gcpcinfo.moduleinfo.ip))
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using GcDevicePc.Common;
namespace GcDevicePc.ProThread
{
class ChannelDataTh
{
/// <summary>
/// 单实例对象
/// </summary>
private static ChannelDataTh instance = null; //静态私有成员变量
/// <summary>
/// 单实例对象锁
/// </summary>
private static object _lock = new object();
/// <summary>
/// 数据锁
/// </summary>
private static object _datalock = new object();
#region 单实例实现
public static ChannelDataTh GetInstance()
{
if (instance == null)
{
lock (_lock)
{
if (instance == null)
{
instance = new ChannelDataTh();
}
}
}
return instance;
}
#endregion
#region 分析仪数据读取线程
private Thread _tGetChannelData; //分析仪读取线程
private ManualResetEvent channeldata_mre = new ManualResetEvent(false); //信号控制量
#endregion
public void ChannelDataThStart()
{
if (channeldata_mre != null)
{
channeldata_mre.Reset();
}
if (_tGetChannelData != null)
{
_tGetChannelData.Abort();
}
_tGetChannelData = new Thread(ChannelDataThProc);
_tGetChannelData.Priority = ThreadPriority.Highest;
// _tGetAnalyzerData.IsBackground = true;
_tGetChannelData.Start();
}
/// <summary>
/// 判断线程工作状态
/// </summary>
/// <returns></returns>
public bool ThreadWorking()
{
if (_tGetChannelData != null)
{
if (_tGetChannelData.ThreadState == ThreadState.Running || (_tGetChannelData.ThreadState & ThreadState.WaitSleepJoin) != 0)
return true;
else
return false;
}
return false;
}
/// <summary>
/// 线程停止
/// </summary>
public void ChannelDataThStop()
{
channeldata_mre.Set();
}
/// <summary>
/// 线程工作函数
/// </summary>
private void ChannelDataThProc()
{
while (!channeldata_mre.WaitOne(500))
{
ReadChannelData();
}
}
private void ReadChannelData()
{
MoudbusOperation.GetInstance().Get_Channel_Data();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using GcDevicePc.Common;
namespace GcDevicePc.ProThread
{
class DisplayDataTh
{
/// <summary>
/// 单实例对象
/// </summary>
private static DisplayDataTh instance = null; //静态私有成员变量
/// <summary>
/// 单实例对象锁
/// </summary>
private static object _lock = new object();
/// <summary>
/// 数据锁
/// </summary>
private static object _datalock = new object();
#region 单实例实现
public static DisplayDataTh GetInstance()
{
if (instance == null)
{
lock (_lock)
{
if (instance == null)
{
instance = new DisplayDataTh();
}
}
}
return instance;
}
#endregion
#region 分析仪数据读取线程
private Thread _tGetDisplayData; //分析仪读取线程
private ManualResetEvent displaydata_mre = new ManualResetEvent(false); //信号控制量
#endregion
public void DisplayDataThStart()
{
if (displaydata_mre != null)
{
displaydata_mre.Reset();
}
if (_tGetDisplayData != null)
{
_tGetDisplayData.Abort();
}
_tGetDisplayData = new Thread(DisplayDataThProc);
_tGetDisplayData.Priority = ThreadPriority.Highest;
// _tGetAnalyzerData.IsBackground = true;
_tGetDisplayData.Start();
}
/// <summary>
/// 判断线程工作状态
/// </summary>
/// <returns></returns>
public bool ThreadWorking()
{
if (_tGetDisplayData != null)
{
if (_tGetDisplayData.ThreadState == ThreadState.Running || (_tGetDisplayData.ThreadState & ThreadState.WaitSleepJoin) != 0)
return true;
else
return false;
}
return false;
}
/// <summary>
/// 线程停止
/// </summary>
public void DisplayDataThStop()
{
displaydata_mre.Set();
}
/// <summary>
/// 线程工作函数
/// </summary>
private void DisplayDataThProc()
{
while (!displaydata_mre.WaitOne(1000))
{
ReadDisplayData();
}
}
private void ReadDisplayData()
{
MoudbusOperation.GetInstance().GetGCTemp();
MoudbusOperation.GetInstance().GetValveState();
MoudbusOperation.GetInstance().GetALLSWState();
MoudbusOperation.GetInstance().GetFireState();
MoudbusOperation.GetInstance().GetErrorState();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using GcDevicePc.Common;
namespace GcDevicePc.ProThread
{
class HmiStatueTh
{
/// <summary>
/// 单实例对象
/// </summary>
private static HmiStatueTh instance = null; //静态私有成员变量
/// <summary>
/// 单实例对象锁
/// </summary>
private static object _lock = new object();
/// <summary>
/// 数据锁
/// </summary>
private static object _datalock = new object();
#region 单实例实现
public static HmiStatueTh GetInstance()
{
if (instance == null)
{
lock (_lock)
{
if (instance == null)
{
instance = new HmiStatueTh();
}
}
}
return instance;
}
#endregion
#region 分析仪数据读取线程
private Thread _tGetHmiStatue; //分析仪读取线程
private ManualResetEvent hmistatus_mre = new ManualResetEvent(false); //信号控制量
#endregion
public void HmiStatueThStart()
{
if (hmistatus_mre != null)
{
hmistatus_mre.Reset();
}
if (_tGetHmiStatue != null)
{
_tGetHmiStatue.Abort();
}
_tGetHmiStatue = new Thread(HmiStatueThProc);
_tGetHmiStatue.Priority = ThreadPriority.Highest;
// _tGetAnalyzerData.IsBackground = true;
_tGetHmiStatue.Start();
}
/// <summary>
/// 判断线程工作状态
/// </summary>
/// <returns></returns>
public bool ThreadWorking()
{
if (_tGetHmiStatue != null)
{
if (_tGetHmiStatue.ThreadState == ThreadState.Running || (_tGetHmiStatue.ThreadState & ThreadState.WaitSleepJoin) != 0)
return true;
else
return false;
}
return false;
}
/// <summary>
/// 线程停止
/// </summary>
public void HmiStatueThStop()
{
hmistatus_mre.Set();
}
/// <summary>
/// 线程工作函数
/// </summary>
private void HmiStatueThProc()
{
while (!hmistatus_mre.WaitOne(1000))
{
ReadHmiStatue();
}
}
private void ReadHmiStatue()
{
MoudbusOperation.GetInstance().GetHMIStatusData();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using GcDevicePc.Common;
namespace GcDevicePc.ProThread
{
class ThreadMonitor
{
#region 检查线程时间
private ushort monitortimer = 1000 * 30; //线程检查时间
#endregion
#region 单实例实现
private static ThreadMonitor instance = null; //静态私有成员变量
private static object _lock = new object();
public static ThreadMonitor GetInstance()
{
if (instance == null)
{
lock (_lock)
{
if (instance == null)
{
instance = new ThreadMonitor();
}
}
}
return instance;
}
#endregion
#region 连接中心初始化所有读取线程
/// <summary>
/// 显示数据
/// </summary>
private DisplayDataTh displayDataTh = DisplayDataTh.GetInstance();
/// <summary>
/// 状态数据
/// </summary>
private HmiStatueTh hmiStatueTh = HmiStatueTh.GetInstance();
/// <summary>
/// 信号数据
/// </summary>
private ChannelDataTh channelDataTh = ChannelDataTh.GetInstance();
#endregion
#region 通讯中心功能函数
/// <summary>
/// 开启所有通讯线程
/// </summary>
public void StartALLCommunication()
{
if (!displayDataTh.ThreadWorking())
displayDataTh.DisplayDataThStart();
if (!hmiStatueTh.ThreadWorking())
hmiStatueTh.HmiStatueThStart();
if (!channelDataTh.ThreadWorking())
channelDataTh.ChannelDataThStart();
}
/// <summary>
/// 关闭所有通讯线程
/// </summary>
public void StopALLCommunication()
{
if (displayDataTh.ThreadWorking())
displayDataTh.DisplayDataThStop();
if (hmiStatueTh.ThreadWorking())
hmiStatueTh.HmiStatueThStop();
if (channelDataTh.ThreadWorking())
channelDataTh.ChannelDataThStop();
}
#endregion
#region 通讯中心线程检查进程
private Thread _tThreadMonitor; //分析仪读取线程
private ManualResetEvent monitor_mre = new ManualResetEvent(false); //信号控制量
public void MonitorThStart()
{
if (monitor_mre != null)
{
monitor_mre.Reset();
}
if (_tThreadMonitor != null)
{
_tThreadMonitor.Abort();
}
_tThreadMonitor = new Thread(MonitorThProc);
// _tThreadMonitor.IsBackground = true;
_tThreadMonitor.Start();
}
public bool ThreadWorking()
{
if (_tThreadMonitor != null)
{
if (_tThreadMonitor.ThreadState == ThreadState.Running ||
(_tThreadMonitor.ThreadState & ThreadState.WaitSleepJoin) != 0)
return true;
else
return false;
}
return false;
}
public void MonitorThStop()
{
monitor_mre.Set();
}
/// <summary>
/// 判断是否所有通讯线程已经退出
/// </summary>
/// <returns></returns>
public bool AllIsClosed()
{
int ret = 0;
if (displayDataTh.ThreadWorking())
{
ret += 1;
}
if (hmiStatueTh.ThreadWorking())
{
ret += 1;
}
if (channelDataTh.ThreadWorking())
{
ret += 1;
}
return ret == 0 ? true : false;
}
/// <summary>
/// 每一分钟监测一次 最小做样是2min
/// </summary>
private void MonitorThProc()
{
while (!monitor_mre.WaitOne(monitortimer))
{
if (!displayDataTh.ThreadWorking())
{
Log.Info("数据显示线程 重启");
displayDataTh.DisplayDataThStart();
}
if (!hmiStatueTh.ThreadWorking())
{
Log.Info("HMI状态线程 重启");
hmiStatueTh.HmiStatueThStart();
}
if (!channelDataTh.ThreadWorking())
{
Log.Info("信号线程线程 重启");
channelDataTh.ChannelDataThStart();
}
}
}
#endregion
}
}
...@@ -156,6 +156,8 @@ namespace GcDevicePc ...@@ -156,6 +156,8 @@ namespace GcDevicePc
globaldata.m_appinit.InitAppFolderGC(); globaldata.m_appinit.InitAppFolderGC();
_appInitInfo = "载入方法配置"; _appInitInfo = "载入方法配置";
globaldata.m_appinit.InitAppDefaultConfig(); globaldata.m_appinit.InitAppDefaultConfig();
_appInitInfo = "启动检测线程";
globaldata.m_appinit.StartDataThread();
} }
private void StartFormbgWorker_DoWork(object sender, DoWorkEventArgs e) private void StartFormbgWorker_DoWork(object sender, DoWorkEventArgs e)
......
...@@ -3,7 +3,7 @@ using System.Collections; ...@@ -3,7 +3,7 @@ using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using GcDevicePc.Common;
using GcDevicePc.IniParam; using GcDevicePc.IniParam;
using GcDevicePc.GCBuffer; using GcDevicePc.GCBuffer;
...@@ -149,8 +149,10 @@ namespace GcDevicePc ...@@ -149,8 +149,10 @@ namespace GcDevicePc
public static bool startflag = false; //开始按键的标志位 public static bool startflag = false; //开始按键的标志位
public static bool startclear = false; //清除开始按键之前的数据 public static bool startclear = false; //清除开始按键之前的数据
public static bool stopflag = false; //停止按键的标志位 public static bool stopflag = false; //停止按键的标志位
public static bool cancelflag = false; //取消按键的标志位 public static bool cancelflag = false; //取消按键的标志位
public static GCModbus global_moudbus = new GCModbus();
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment