100分求多线程循环打印的思路

aspvfp 2012-05-15 05:33:54
比方说网络打印机 有5台 192.168.0.10 - 192.168.0.15


有台PC服务器 所有的打印请求都会放在数据库里3张表里(不同的表 打印的格式不一样)
现在要求就是做个打印服务器 循环采用多线程 向不同的打印机输出打印内容 打印成功后回填打印成功标志

数据库大概是这样的

表A
打印内容 打印机IP 打印时间

表B
打印标题 打印内容 打印机IP 打印时间

表C

打印人 打印内容 打印机IP 打印时间

=====================================================
以前早期的做法是单线程 循环表A记录 然后根据打印机IP输出内容 然后循环表B ... 表C

但是问题在于如果有台打印机异常 后面的任务就会一直等待
-------------------------------
现在需要改写这个程序 打算一台打印机就输出一条线程 这样互不干扰


我现在考虑的问题是
1. 对打印机先做循环 取出一共有多少台打印机 然后开启多少条线程 再去数据库里取相应的打印记录 对表A B C进行循环

还是

2. 先取出所有数据然后 看取出数据里有多少打印机 在开启相应的线程
比如
表A 有 3条记录 192.168.0.11 2条记录 192.168.0.15 1条记录
表B 有 5条记录 192.168.0.11 1条记录 192.168.0.10 3条记录 192.168.0.15 1条记录
表C 有10条记录 192.168.0.12 3条记录 192.168.0.13 5条记录 192.168.0.14 2条记录


感觉思维有点混乱 又是多线程 又是多表的

有没人做过类似的 帮忙梳理梳理思路





...全文
112 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
aspvfp 2012-05-17
  • 打赏
  • 举报
回复

List<PosPrinter> poss = new List<PosPrinter>(); //主任务 创建个打印机集合

foreach (DataRow item in ds.Tables[0].Rows) //读取记录
{
PosPrinter pos = new PosPrinter() { ip = item["printIP"].ToString() };
if (!poss.Contains(pos)) //如果打印机集合里没有这台打印机 就添加
{
poss.Add(pos);
}

//这里添加需要打印的内容 赋给打印机
pos.Works.Add(item["title"].ToString()); //这里好像感觉也有问题


}


//然后对打印机做循环
foreach (PosPrinter pos in poss)
{
//这里的线程 我总担心前一次的还没做完 又执行到这里又new 一个线程
Thread worker = new Thread(new ThreadStart(pos.PrintWork));
worker.Start();


}


PosPrinter 类代码


public class PosPrinter :IEquatable<PosPrinter>
{
public string ip { get; set; }
public List<string> Works = new List<string>(); //工作集合
BeiYangOPOS opos = new BeiYangOPOS();
public void PrintWork() {
//执行打印任务
}
}


effun 2012-05-16
  • 打赏
  • 举报
回复
第2个方法吧,主线程读出所有数据,然后根据打印机的IP地址将数据重新组合,形成打印队列,再针对每台打印机开启一个新的线程。如果有可能的话,可以先检查相应打印机的线程是否还活着,如果活着就直接加到线程相应的队列里。当一条记录打印完成之后,打印机线程通知主线程打印完毕,主线程去更新数据设置打印成功的标志。
liouse 2012-05-16
  • 打赏
  • 举报
回复
只按照表走就行,多线程只是解决方法。可以在程序里用timer控制。

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧