C#中利用多线程控制打印的暂停和继…
2014-03-14 21:38
225 查看
感谢老大的指导----本文转载老大http://blog.csdn.net/Luckeryin/archive/2009/07/13/4345293.aspx
C#中,通常涉及到打印,我们一般都会用到PrintDocument类,用该类来实现打印真是又方便又强大.程序员可以非常轻松的控制打印内容.然而PrintDocument类提供了打印"取消"功能,却没有为我们提供打印的"暂停"与"继续".这对与想在打印过程中实现对打印任务的控制的初学者来说,制造了不少麻烦.
其实,实现打印任务的"暂停"与"继续".我们可以借助于API函数"SetJob"来实现.这个函数可以对一个打印作业的状态进行控制,它在VB中的声明如下:
Declare Function SetJob Lib "winspool.drv" Alias "SetJobA"
(ByVal hPrinter As Long, ByVal JobId As Long, ByVal Level As Long,
pJob As Byte, ByVal Command As Long) As Long
返回值及相关参数说明请参考有关资料,这本不想过多的阐述.因为本文想着重讲的是在C#中如何简单有效的控制打印任务.
由打印任务的暂停与继续我们可能很自然的想到了C#中线程的暂停与继续.而如果把打印任务运行在某个线程上,然后控制该线程的暂停与继续,不就可以实现对打印任务的控制了吗?
想到这里,那我们就动手测试一下吧:
打印暂停时的界面:
以下为关键代码:
Thread th;
private int pageCounter;
public delegate void invoke();
private void button1_Click(object sender, System.EventArgs e)
{
pageCounter = 0;
//开始一个新的线程来完成打印任务:
th = new Thread( new ThreadStart(
printDocumentWithAHardJob.Print));
th.Start();
//打印开始以后,原"打印"按钮不可用,后"暂停"变得可用.
button1.Enabled = false;
button3.Enabled = true;
}
//这是实现打印内容的关键方法.每打印一页,都会执行一次该方法.注意啦,该方法已经运行在新创建的th线程上了.
private void printDocumentWithAHardJob_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
//每页打印前小停一会,以便我们观察打印过程,实际打印中可以不要这一句
System.Threading.Thread.Sleep(Convert.ToInt32(numericUpDownDelay.Value));
//以下几句在页面上画一个图形,做为打印输入的页面内容
e.Graphics.DrawRectangle(Pens.Black, e.MarginBounds);
e.Graphics.DrawLine(Pens.Black, e.MarginBounds.X, e.MarginBounds.Y,
e.MarginBounds.X + e.MarginBounds.Width, e.MarginBounds.Y +
e.MarginBounds.Height);
e.Graphics.DrawLine(Pens.Black, e.MarginBounds.X +
e.MarginBounds.Width, e.MarginBounds.Y, e.MarginBounds.X,
e.MarginBounds.Y + e.MarginBounds.Height);
pageCounter++;
//检查是否打印完成
if (pageCounter == numericUpDownPages.Value)
{
e.HasMorePages = false;
//以下为调用委托方法来完成对主线程上几个按钮可用性的设置(线程间的操作,不可以直接访问非当前线程上创建的控件)
invoke InvokeMothed=new invoke(SetButton);
this.Invoke(InvokeMothed);
}
else
e.HasMorePages = true;
}
//委托方法
private void SetButton()
{
button1.Enabled = true;
button3.Enabled = false;
}
//根据th线程的状态来控制打印任务(即th线程)的挂起与恢复
private void button3_Click(object sender, EventArgs e)
{
if (th.ThreadState == ThreadState.Suspended)
{
th.Resume();
button3.Text = "暂停";
C#中,通常涉及到打印,我们一般都会用到PrintDocument类,用该类来实现打印真是又方便又强大.程序员可以非常轻松的控制打印内容.然而PrintDocument类提供了打印"取消"功能,却没有为我们提供打印的"暂停"与"继续".这对与想在打印过程中实现对打印任务的控制的初学者来说,制造了不少麻烦.
其实,实现打印任务的"暂停"与"继续".我们可以借助于API函数"SetJob"来实现.这个函数可以对一个打印作业的状态进行控制,它在VB中的声明如下:
Declare Function SetJob Lib "winspool.drv" Alias "SetJobA"
(ByVal hPrinter As Long, ByVal JobId As Long, ByVal Level As Long,
pJob As Byte, ByVal Command As Long) As Long
返回值及相关参数说明请参考有关资料,这本不想过多的阐述.因为本文想着重讲的是在C#中如何简单有效的控制打印任务.
由打印任务的暂停与继续我们可能很自然的想到了C#中线程的暂停与继续.而如果把打印任务运行在某个线程上,然后控制该线程的暂停与继续,不就可以实现对打印任务的控制了吗?
想到这里,那我们就动手测试一下吧:
打印暂停时的界面:
以下为关键代码:
Thread th;
private int pageCounter;
public delegate void invoke();
private void button1_Click(object sender, System.EventArgs e)
{
pageCounter = 0;
//开始一个新的线程来完成打印任务:
th = new Thread( new ThreadStart(
printDocumentWithAHardJob.Print));
th.Start();
//打印开始以后,原"打印"按钮不可用,后"暂停"变得可用.
button1.Enabled = false;
button3.Enabled = true;
}
//这是实现打印内容的关键方法.每打印一页,都会执行一次该方法.注意啦,该方法已经运行在新创建的th线程上了.
private void printDocumentWithAHardJob_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
{
//每页打印前小停一会,以便我们观察打印过程,实际打印中可以不要这一句
System.Threading.Thread.Sleep(Convert.ToInt32(numericUpDownDelay.Value));
//以下几句在页面上画一个图形,做为打印输入的页面内容
e.Graphics.DrawRectangle(Pens.Black, e.MarginBounds);
e.Graphics.DrawLine(Pens.Black, e.MarginBounds.X, e.MarginBounds.Y,
e.MarginBounds.X + e.MarginBounds.Width, e.MarginBounds.Y +
e.MarginBounds.Height);
e.Graphics.DrawLine(Pens.Black, e.MarginBounds.X +
e.MarginBounds.Width, e.MarginBounds.Y, e.MarginBounds.X,
e.MarginBounds.Y + e.MarginBounds.Height);
pageCounter++;
//检查是否打印完成
if (pageCounter == numericUpDownPages.Value)
{
e.HasMorePages = false;
//以下为调用委托方法来完成对主线程上几个按钮可用性的设置(线程间的操作,不可以直接访问非当前线程上创建的控件)
invoke InvokeMothed=new invoke(SetButton);
this.Invoke(InvokeMothed);
}
else
e.HasMorePages = true;
}
//委托方法
private void SetButton()
{
button1.Enabled = true;
button3.Enabled = false;
}
//根据th线程的状态来控制打印任务(即th线程)的挂起与恢复
private void button3_Click(object sender, EventArgs e)
{
if (th.ThreadState == ThreadState.Suspended)
{
th.Resume();
button3.Text = "暂停";
相关文章推荐
- C#中利用多线程控制打印的暂停和继续
- C#中利用多线程控制打印的暂停和继续
- 利用ManualResetEvent来来控制异步调用的打印的线程的暂停和恢复(转)
- C#中怎樣利用VBA控制word中的某張圖片使 之從左上角移動到右下角(或說從原來的位置向左移動200個單位)
- 【转载】多线程--C#利用多线程实现消费者和生产者模式
- C#中利用委托实现多线程跨线程操作
- 利用VS C# 实现串口控制视频的播放 use VLC
- C#利用zxing.net生成二维码和条形码并实现打印的功能
- 蜘蛛/爬虫程序的多线程控制(C#语言)
- C# 通过委托控制进度条以及多线程更新控件
- 利用CSS控制打印
- HTML中利用WebBrowser控件进行打印页面的控制
- C# API Keybd_event + mouse_event 利用API程序控制按下某键
- 利用CSS控制打印
- [转载]C# 多线程、控制线程数提高循环输出效率
- C#基础-021 利用for循环打印图形
- C#利用Wmi远程控制pc或者获取远程pc的配置信息
- C#控制DataMax指令打印DPL问题总结
- jquery 利用CSS 控制打印样式
- C# 多线程控制UI上的控件