由于打印是跟主线程处在同一个线程,所以在进行打印操作时波形绘制会停顿几秒,这样会影响显示效果,所以将打印操作改为异步调用,用另外一个线程来执行。原来的程序为:
(代码段1)
private void OnPrintEcgRaplayWave(CMsg msg)
{
Debug.Assert(msg.Msg == (uint)MTMultiParamPrintPlugIn.PrintEcgRaplayWave);
Debug.Assert(msg.WParam is CDomPatient);
Debug.Assert(msg.LParam is ArrayList);
CDomPatient cdp = (CDomPatient)msg.WParam;
ArrayList alWaveData = (ArrayList)msg.LParam;
CDocPrintWave cdpw = new CDocPrintWave();
cdpw.SetPrintDocument(cdp, alWaveData);
cdpw.BeginPrint();
... ...
上述代码在接收请求打印消息PrintEcgRaplayWave后开始执行的,由于最后三行代码是直接执行的,所以改为如下代码,创建一个任务包启动另外一个线程,以便执行打印:
(代码段2)
IInvokePackage ip = (IInvokePackage)this.SendSysMsg(new CMsg(MTSystemService.CreateInvokePackage, true));
if (null == ip){
return;
}
ip.TargetObject = this;
ip.TargetMethod = new InvokeHandler_Print(PrintWave);
ip.Parameters.Add(cdp);
ip.Parameters.Add(alWaveData );
ip.Callback = new AsyncCallback(OnPrint_Callback);
this.SendSysMsg(new CMsg(MTSystemService.BeginInvoke, ip));
......
其中ip为任务包,PrintWave函数为启动异步操作时所执行的打印功能,ip.Parameters.Add()方法将参数打包以便传递到新线程中使用。
函数PrintWave的实现为:
(代码段3)
private void PrintWave(CDomPatient cdp, ArrayList alWaveData)
{
if (null == cdp || alWaveData.Count <= 0){
return;
}
CDocPrintWave cdpw = new CDocPrintWave();
cdpw.SetPrintDocument(cdp, alWaveData);
cdpw.BeginPrint();
}
本来这样的实现是可以的,即将原来直接在当前线程的操作用另一个线程来执行,以便当前线程继续其他的操作。但最终运行程序时打印却未成功,一跟踪程序原来在代码段3中传递过来的ArrayList类型参数alWaveData里面的集合为空。怎么会这样呢,在代码段2中代码ip.Parameters.Add(alWaveData );传递参数时明明有成员,但接收时集合却为空。最后查看发打印请求消息PrintEcgRaplayWave的代码才发现原因所在,其代码为:
(代码段4)
this.SendSysMsg(new CMsg(MTMultiParamPrintPlugIn.PrintEcgRaplayWave, this.PatientHistory.Patient, this.m_alWaveData));
this.ClearPrintData();
public void ClearPrintData()
{
this.m_alWaveData.Clear();
... ...
原来此处在发送完请求打印消息后,就调用了函数ClearPrintData,而此函数中进行了集合清空操作:this.m_alWaveData.Clear();由于接收此消息的代码段2中启动的线程为异步操作,也就是说并不能马上执行,而此时上述集合清空的操作已经执行了。并且传递的参数m_alWaveData为对象,即按引用传递的。所以在异步操作开始执行时,此集合对象已经被清空,也就无法进行正确的打印操作了。解决办法是将代码段中2的代码ip.Parameters.Add(alWaveData );改为:ip.Parameters.Add(alWaveData .Clone());即将此参数对象克隆,这样别处对该对象的清除操作并不影响异步操作中对该数据的使用。