程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c# 即時監控 小程序

c# 即時監控 小程序

編輯:C#入門知識

實時監控小程序 

關鍵詞:
委托  線程  異步操作  大數據存儲過程分頁  實時刷新界面數據  聲音報警 任務欄提示   動態任務欄圖標切換   

需求:啟動監控程序後,每隔10秒(可配置多少秒)從後台數據庫查詢一次,
      查詢條件(sql語句可配置),然後返回結果顯示和進行判斷。
      判斷的條件(盡量也可以靈活配置):再返回的數據裡面,空號2大於0的多少倍,
      就要間隔1秒再取一次,如果發現還是2的倍數大,那就就報警,
      如果0的倍數大於2很多,就每隔10秒(可配置)查詢一次

即時插入的數據:(第一列)

\

程序界面:
\

配置:
\

\ \ \
 
實現代碼: using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
namespace SMMMMonitoring
{
public partial class Form1 : Form
{
private static string strConn = ConfigurationManager.AppSettings["conStr"];;
private static string strProcedure = ConfigurationManager.AppSettings["procName"];
private static int pageindex =Convert.ToInt32( ConfigurationManager.AppSettings["pageindex"]);//刷新第幾頁
private static int multiples = Convert.ToInt32(ConfigurationManager.AppSettings["Multiple"]);//報警倍數
StoreProcedure sa = new StoreProcedure(strProcedure, strConn);
public Form1()
{
    InitializeComponent();
    BindDGV();
          
}
private void BindDataWithPage(int Index)
{
    winFormPager1.PageIndex = Index;
    string table = ConfigurationManager.AppSettings["table"];
    string field = ConfigurationManager.AppSettings["Field"];
    string orderby = ConfigurationManager.AppSettings["orderby"];         
    string where = ConfigurationManager.AppSettings["where"];
    DataTable dt = sa.ExecuteDataTable(table, field, orderby, 10, Index, 0, 0, where);
    dataGridView1.DataSource = dt;
    winFormPager1.RecordCount = Convert.ToInt32(sa.ExecuteDataTable(table, field, orderby, 10, Index, 1, 0, where).Rows[0][0]);
}
private void winFormPager1_PageIndexChanged(object sender, EventArgs e)
{
    BindDataWithPage(winFormPager1.PageIndex);
} //線程間操作無效: 從不是創建控件“dataGridView1”的線程訪問它。
//調用 : BindDGV(9,BindDataWithPage);   傳遞參數
/* private delegate void BindDGVDelegate(int n);
private void BindDGV(int n, BindDGVDelegate myDelegate)
{
    if (this.InvokeRequired)
    {
        this.Invoke(myDelegate, n);//同步
    }
    else
    {
        myDelegate(n);
    }
}
*/
/*
    * Control的Invoke和BeginInvoke的委托方法是在主線程,即UI線程上執行的。
    * 也就是說如果你的委托方法用來取花費時間長的數據,然後更新界面什麼的,
    * 千萬別在UI線程上調用Control.Invoke和Control.BeginInvoke,相對於invokeThread線程同步的,因為這些是依然阻塞UI線程的,造成界面的假死。
    * 用Thread來調用BeginInvoke和Invoke
    * 執行順序:  A---  BC (B和C同時執行,B執行在線程UI上,C執行在線程beginInvokeThread上)  --DE
    */
private Thread beginInvokeThread;
private delegate void beginInvokeDelegate();
private void StartMethod()
{
    //C代碼段...... 耗費長時間的操作
    dataGridView1.BeginInvoke(new beginInvokeDelegate(beginInvokeMethod));
    //D代碼段...... 刪掉
}
private void beginInvokeMethod()
{
    //E代碼段  更新界面的方法。
    BindDataWithPage(pageindex);
}
private void BindDGV()
{
    //A代碼段.......
    beginInvokeThread = new Thread(new ThreadStart(StartMethod));
    beginInvokeThread.Start();
    //B代碼段......
} /// <summary>
/// 大於多少倍就報警
/// </summary>
/// <param name="dgv"></param>
/// <param name="n"></param>
public bool Alarm(DataGridView dgv, int n)
{
    int Space = 0; int Success = 0;
    Dictionary<string, int> dict = DictionaryColumns(dgv);
    foreach (KeyValuePair<string, int> kvp in dict)
    {
        if (kvp.Key == "2")
        {
            Space = kvp.Value;
        }
        if (kvp.Key == "0")
        {
            Success = kvp.Value;
        }
    }
    if (Space >= Success * n)
    {
        //報警
        // MessageBox.Show("報警!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);              
        return true;
    }
    else
    {
        //MessageBox.Show("bu報警!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        return false;
  &nbs

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved