求有项目经验的给点思路, 多线程,多台网络打印机 循环打印任务 分不够还可以加 也可以有偿提供相关代码~~祝大家节日快乐.
最近在做个后厨打印的东西 要求是不断循环从数据库表里取出需要打印的任务 根据发送到各个打印机 如果打印机有什么情况主界面即时响应
我设想的大概思路是这样的 先对打印机 做了个类
public class Printer{ public string Name { get; set; } //打印机名称 public int Connecttime { get; set; } //超时时间 public string IP { get; set; } //打印机IP public string Status{get;set;} //打印机状态 需要更新回主界面 public bool Open(){} //打开打印机 public bool Close(){} //关闭打印机 public bool Write(string strdata){} //打印机写内容}
List<Printer> printers = new List<Printer>(); private void Form1_Load(object sender, EventArgs e) { // 另外有一张表维护了所有打印机的信息 printers.Add(xxxx); // // 然后针对每个打印机开个线程 foreach (Printer p in printers) //循环所有打印机 { //这里创建线程 } }
class Program { /// <summary> /// 打印任务管理类 /// </summary> public class JobManager { public delegate void JobHasGotDel(object sender, JobManagerEventArgs e);//取到打印任务委托 public event JobHasGotDel JobHasGot;//取到打印任务事件 private int _printtimes = 5;//打印机数量 public void StartGetJob(int printtimes) { this._printtimes = printtimes; Thread getjobthread = new Thread(new ParameterizedThreadStart(GetJobProc)); getjobthread.Start(); } private void GetJobProc(object obj)//取打印任务线程 { while (true) { Random ran = new Random(); int rantime = ran.Next(5000); Thread.Sleep(rantime);//模拟取打印任务时间消耗 jobqueue.Enqueue(new PrintJob("job" + rantime.ToString(), _printtimes));//取到后加入打印任务队列 Console.WriteLine("job " + rantime.ToString() + " got!"); if (JobHasGot != null) JobHasGot(this, new JobManagerEventArgs(_printtimes));//引发已取到打印任务事件 } } } /// <summary> /// 打印任务管理参数类 /// </summary> public class JobManagerEventArgs : EventArgs { private int _printtimes;//打印次数/打印机数量 public int Printtimes { get { return _printtimes; } set { _printtimes = value; } } public JobManagerEventArgs(int printtimes) { this._printtimes = printtimes; } } /// <summary> /// 打印类 /// </summary> public class Printer { public delegate void PrintFinishDel(string jobname); public event PrintFinishDel PrintHasFinished;//打印完成事件 public void StartPrint(int printtimes) { for (int i = 0; i < printtimes; i++) { Thread th = new Thread(new ParameterizedThreadStart(StartPrintProc)); th.Start(); } } private void StartPrintProc(object obj)//打印线程 { lock (jobqueue) { if (jobqueue.Count != 0) { PrintJob job = jobqueue.Peek();//获取打印任务队列第一个打印任务 if (job.Printcount != 0) { job.Printed();//当前打印机打印完成 if (PrintHasFinished != null) PrintHasFinished(job.Jobname);//引发打印完成事件 } else jobqueue.Dequeue();//全都打印完毕则移出队列 } } } } /// <summary> /// 打印任务类 /// </summary> public class PrintJob { private int _printcount = 0;//当前任务还应打印几次 private string _jobname; public int Printcount { get { lock (this) { return _printcount; } } set { _printcount = value; } } public PrintJob(string jobname, int printcount) { this._jobname = jobname; this._printcount = printcount; } public string Jobname { get { return _jobname; } set { _jobname = value; } } public void Printed() { System.Threading.Interlocked.Decrement(ref _printcount); } } static Queue<PrintJob> jobqueue = new Queue<PrintJob>();//打印任务队列 static Printer printer = new Printer(); static void Main(string[] args) { JobManager jm = new JobManager(); jm.StartGetJob(10);//10台打印机 jm.JobHasGot += new JobManager.JobHasGotDel(jm_JobHasGot); printer.PrintHasFinished += new Printer.PrintFinishDel(printer_PrintHasFinished); Console.ReadLine(); } static void printer_PrintHasFinished(string jobname) { Console.WriteLine(jobname + " has finished!");//每个打印任务完成的通知 } static void jm_JobHasGot(object sender, JobManagerEventArgs e) { printer.StartPrint(e.Printtimes);//有新的打印任务了 } }
[解决办法]
线程不要先创建,等到有任务时再创建
主界面负责循环抓取所有打印任务,抓去后将任务根据不同打印机分类,添加到各自的任务列表,此时再开启打印子线程,子线程中循环读取自己的任务列表,直到所有的任务处理完再退出线程,处理过程中如果主界面再次从数据库中抓取到任务,此时添加到任务列表后判断子线程是否正在工作,如果没有工作再开启子线程