发布:2022/12/26 15:08:14作者:管理员 来源:本站 浏览次数:564
public static void Testing(Form sender, DelegateShowStateInfo method)}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Collections;
using System.Windows.Forms;
namespace ThredProcessQueue
{
//用于顯示狀態的代理方法類型定義
public delegate void DelegateShowStateInfo(string state);
/// <summary>
/// 測試器
/// </summary>
public class QueueTester
{
private static bool _Exit = false; //標記是否已中斷測試程序
private static Form _OwnerForm; //測試的窗體
private static DelegateShowStateInfo _StateMethod;
private static IList _Queue1 = new ArrayList(); //Queue1的數據
private static IList _Queue2 = new ArrayList(); //Queue2的數據
private static IList _Queue3 = new ArrayList(); //Queue3的數據
public static void StopThread()
{
_Exit = true;
_OwnerForm = null;
}
public static void Testing(Form sender, DelegateShowStateInfo method)
{
_StateMethod = method;
_OwnerForm = sender;
_Exit = false;
ThreadPool.QueueUserWorkItem(MainTestThread);
ThreadPool.QueueUserWorkItem(Queue1Thread); //啟動Queue1線程
ThreadPool.QueueUserWorkItem(Queue2Thread); //啟動Queue2線程
}
//測試用的主線程,循環向隊列1中壓入數據。
public static void MainTestThread(object state)
{
Random R = new Random(1);
double V = 0;
while (_Exit == false)
{
//在while(true)里一直对数据进行读取,然后放到queue1中,
//与此同时如果queue1中有数据,则线程1就开启
//臨時數據,隨機數
V = R.NextDouble();
_Queue1.Add(V); //把數據插入到隊列1
Application.DoEvents();
ShowState();
Thread.Sleep(100);//生成隨機數太快,為了看清效果,暫停n毫秒
}
}
//对queue1中的数据进行处理,处理后放到queue2中
public static void Queue1Thread(object state)
{
while (_Exit == false)
{
while (_Queue1.Count > 0)
{
//对queue1中的数据进行处理,处理后放到queue2中
_Queue2.Add(_Queue1[0]);
_Queue1.RemoveAt(0);
Application.DoEvents();
ShowState();
}
}
}
//对queue2中的数据进行处理,处理后放到queue3中
public static void Queue2Thread(object state)
{
while (_Exit == false)
{
while (_Queue2.Count > 0)
{
//对queue1中的数据进行处理,处理后放到queue2中
_Queue3.Add(_Queue2[0]);
_Queue2.RemoveAt(0);
Application.DoEvents();
ShowState();
}
}
}
//用于監視各隊列狀態的線程
public static void ShowState()
{
string stateInfo =
QueueTester._Queue1.Count.ToString() " -> "
QueueTester._Queue2.Count.ToString() " -> "
QueueTester._Queue3.Count.ToString();
try
{
if (_OwnerForm != null)
{
_OwnerForm.Invoke(_StateMethod, stateInfo);
Application.DoEvents();
}
}
catch
{
}
}
}
}
© Copyright 2014 - 2024 柏港建站平台 ejk5.com. 渝ICP备16000791号-4