示例是一个使用c#编写的 多线程ping IP列表的小程序。
主要功能:
1.通过EXCEL导入主机列表数据;
2.通过配置文件控制程序的一些条件参数等;
3.启动多线程轮循或单次对EXCEL 导入的数据进行 ping请求,并显示状态
代码结构及类文件描述:
ThreadPool 类 线程控制的主类,线程相关控制 启、停、执行的方法等都集中的这个类中.
ExcelHelper 类 EXCEL 帮助类,实现对excel 导入、导出功能.
Log 类 日志操作类.
MessageOperation 类 消息提示类 .
ConnectionManager 类 ping 主机的具体实现类.
CommandHelper 类 c# 进行命令操作的帮助类,可执行DOS命令,(未使用).
程序附件地址:https://share.weiyun.com/6be03d694d8c046532422c4ad346add3
ThreadPool文件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Data;
using Common;
namespace MonitorWindows
{
public delegate void RefreshVieweState();
public delegate void RefreshVieweDelegate(MonitorModel model,int index,int total);
public class CThreadPool
{
//存储加载的IP数据
public static List<MonitorModel> IPList = new List<MonitorModel>();
public CThreadPool(RefreshVieweDelegate refreshViewDelegate,
RefreshVieweState start, RefreshVieweState end
,RefreshVieweState allColse) {
this.refreshView = refreshViewDelegate;
this.refreshViewStart = start;
this.refreshViewEnd = end;
this.refreshVieAllColse = allColse;
}
//更新界面方法
public RefreshVieweDelegate refreshView;
public RefreshVieweState refreshViewStart;
public RefreshVieweState refreshViewEnd;
public RefreshVieweState refreshVieAllColse;
//当前轮询开始时间
public DateTime PollingStartTime;
//上次完成时间
public DateTime PollingDoneTime;
//轮询状态
public PollingState pollingState = PollingState.Done;
//启动线程,计算时间定时开启轮询
Thread mainThread;
bool isRuning = true; //运行标识
bool isLoop = true;//持续轮循还是单次
int times = 0; //已轮循次数
//开始线程
public void DoPolling(bool isloop) {
if (mainThread == null || mainThread.ThreadState != ThreadState.Running)
{
PollingDoneTime = DateTime.MinValue;
times = 0;
this.isLoop = isloop;
isRuning = true;
mainThread = new Thread(new ThreadStart(Loop));
mainThread.Start();
}
}
private void Loop() {
while (isRuning) {
//开始
TimeSpan ts = DateTime.Now - PollingDoneTime;
if (ts.TotalSeconds >= ConfigHelper.FollingSpan && pollingState == PollingState.Done)
{
if (StartThread()) {
refreshViewStart();
}
}
//结束
if (indexer == 0 && pollingState == PollingState.Polling) {
bool alldone = true;
foreach (Thread item in threads) {
if (item.ThreadState == ThreadState.Running)
alldone = false;
}
if (alldone)
{
PollingDoneTime = DateTime.Now;
pollingState = PollingState.Done;
refreshViewEnd();
if (isLoop == false && times > 0)
{
refreshVieAllColse();
}
}
}
Thread.Sleep(2000);
}
}
//停止所有线程
public void Close()
{
for (int i = 0; i < threads.Length; i++)
{
Thread thread = threads[i];
if (thread != null && thread.ThreadState == ThreadState.Running)
{
thread.Abort();
}
}
}
//判断是否停止完成
public bool CheckAllClose()
{
bool allstop = false;
while (allstop == false) {
allstop = true;
for (int i = 0; i < threads.Length; i++)
{
Thread thread = threads[i];
if (thread != null && thread.ThreadState != ThreadState.Aborted
&& thread.ThreadState != ThreadState.Stopped)
{
allstop = false;
}
}
Thread.Sleep(100);
}
while (pollingState != PollingState.Done) { Thread.Sleep(100); }
mainThread.Abort();
while (mainThread != null && mainThread.ThreadState != ThreadState.Aborted
&& mainThread.ThreadState != ThreadState.Stopped)
{
Thread.Sleep(100);
}
isRuning = false;
mainThread = null;
refreshVieAllColse();
return allstop;
}
#region 轮询线程
private static object lockObj = new object();
Thread[] threads = new Thread[ConfigHelper.ThreadNum];
private int indexer = 0;
private int total = 0;
PollingObject[] pollingList = null;
public PollingObject[] PollingList
{
get
{
return pollingList;
}
}
//Dictionary<string, PollingObject> dopings = new Dictionary<string, PollingObject>();
//填充需要轮询对象集合
private void FillPolling() {
lock (lockObj)
{
//查询数据集获取count并加入数组
pollingList = PollingObject.QueryFromDataBase();
total = PollingList.Length;
indexer = total; // 从后往前轮询
}
}
//初始化线程
private void InitThread()
{
for (int i = 0; i < threads.Length; i++) { Thread thread = threads[i]; thread = new Thread(new ThreadStart(DoMethod)); threads[i] = thread; } } //开始线程进行轮询 private bool StartThread() { if (isLoop == false && times > 0) {
return false;
}
InitThread();
if (pollingState == PollingState.Polling)
{
return false;
}
else {
//开始一次新轮询
FillPolling();
pollingState = PollingState.Polling;
PollingStartTime = DateTime.Now;
}
foreach (Thread thread in threads)
{
if (thread.ThreadState == ThreadState.Unstarted
|| thread.ThreadState == ThreadState.Stopped)
{
thread.Start();
}
}
times++;
return true;
}
//线程执行的方法
private void DoMethod() {
PollingObject pobj = null;
do
{
pobj = GetNextPolling();
if (pobj != null)
{
//dopings.Add(pobj.monitorModel.Id.ToString(), pobj);
//ping 对象IP
pobj.PingService(PollingStartTime);
//刷新界面
refreshView(pobj.monitorModel,pobj.index,total);
//dopings.Remove(pobj.monitorModel.Id.ToString());
}
} while (pobj != null && isRuning);
}
//获取下一个轮询对象
private PollingObject GetNextPolling()
{
PollingObject pollingObject = null;
lock (lockObj)
{
if (indexer != 0)
{
indexer--;
pollingObject = pollingList[indexer];
}
}
return pollingObject;
}
#endregion
}
public class PollingObject{
public MonitorModel monitorModel;
public int index;
public PollingObject(MonitorModel model) {
this.monitorModel = model;
}
public void PingService(DateTime startTime) {
if (monitorModel == null)
return;
ConnectionManager connection = new ConnectionManager(monitorModel.Ip);
connection.PingTimes();
bool isonline = connection.IsOnline;
if (isonline)
{
bool isdelay = connection.IsDelay;
if (isdelay)
{
monitorModel.Status = MonitorState.Delay;
}
else
{
monitorModel.Status = MonitorState.Normal;
}
}
else
{
monitorModel.Status = MonitorState.Lost;
}
}
//查询出所有需要摄像头
public static PollingObject[] QueryFromDataBase() {
PollingObject[] objects = new PollingObject[0];
if (CThreadPool.IPList != null && CThreadPool.IPList.Count > 0) {
objects = new PollingObject[CThreadPool.IPList.Count];
}
int temp = 0;
foreach (MonitorModel model in CThreadPool.IPList) {
PollingObject pollingObject = new PollingObject(model);
pollingObject.index = temp;
objects[temp] = pollingObject;
temp++;
}
return objects;
}
}
}
用户今天 : 3
用户昨天 : 15
用户最近的7天 : 69
用户最近的30天 : 283
用户这个月 : 229
用户这一年 : 4357
合计用户 : 6149
查看今天 : 7
查看昨天 : 15
查看最近7天 : 74
查看最近30天的 : 306
查看这个月 : 242
查看这一年 : 4829
合计查看 : 7484
谁是在线的 : 0