我有以下sub,它在创建新文件时在新线程中启动另一个sub。第二个子打印文件(PDF)。到目前为止一切正常。
Private Sub PrintPDF(Datei As String)
Try
Dim startPrint As New Thread(AddressOf PrintNow)
startPrint.IsBackground = False
startPrint.Start(Datei)
Catch ex As Exception
sendmail(__FUNCTION__(), ex.Message, True)
Err.Clear()
End Try
End Sub
现在我的问题。在某些情况下,我必须打印文件两次或更多次(不同的纸盘)。当同一台打印机的两个文件同时创建时,会发生以下输出:
打印1 - 第1页 打印2 - 第1页 打印1 - 第2页 打印2 - 第2页
我从文件名中使用了哪台打印机:
00_99999999〜FreePDF〜1〜0〜1〜1_K1_K2_AA_AA〜0〜16〜201703020716530219.pdf
- > FreePDF
现在我的问题是:如果另一个线程使用相同的打印机,是否有可能等待线程结束?如果打印机没有正在运行的线程,则可以进行并行打印。
提前谢谢。
迈克尔
答案 0 :(得分:1)
您可以同步用于打印的代码的关键部分。使用打印机名称字典来对象来组织锁定对象。
Private dictionaryLock As New Object()
Private printerLocks As New Dictionary(Of String, Object)()
Private Sub PrintNow(datei As String)
Dim printerName = datei.Split("~"c)(1)
SyncLock dictionaryLock
If Not printerLocks.ContainsKey(printerName) Then
printerLocks.Add(printerName, New Object())
End If
End SyncLock
SyncLock printerLocks(printerName)
Console.WriteLine("Started printing on {0} - {1}", printerName, datei)
Thread.Sleep(2000) ' print here
Console.WriteLine("Finished printing on {0} - {1}", printerName, datei)
End SyncLock
End Sub
使用此
进行测试Sub Main()
PrintPDF("0~FreePDF1~1")
PrintPDF("0~FreePDF2~1")
PrintPDF("0~FreePDF7~1")
PrintPDF("0~FreePDF1~2")
PrintPDF("0~FreePDF4~1")
PrintPDF("0~FreePDF2~2")
PrintPDF("0~FreePDF1~3")
PrintPDF("0~FreePDF3~1")
PrintPDF("0~FreePDF3~2")
PrintPDF("0~FreePDF5~1")
PrintPDF("0~FreePDF1~4")
PrintPDF("0~FreePDF2~3")
PrintPDF("0~FreePDF6~1")
PrintPDF("0~FreePDF3~3")
End Sub
开始在FreePDF1上打印 - 0~FreePDF1~1
开始在FreePDF4上打印 - 0~FreePDF4~1
开始在FreePDF2上打印 - 0~FreePDF2~1
开始在FreePDF7上打印 - 0~FreePDF7~1
开始在FreePDF5上打印 - 0~FreePDF5~1
开始在FreePDF3上打印 - 0~FreePDF3~1
开始在FreePDF6上打印 - 0~FreePDF6~1
在FreePDF4上完成打印 - 0~FreePDF4~1
在FreePDF1上完成打印 - 0~FreePDF1~1
开始在FreePDF1上打印 - 0~FreePDF1~2
在FreePDF2上完成打印 - 0~FreePDF2~1
开始在FreePDF2上打印 - 0~FreePDF2~2
在FreePDF7上完成打印 - 0~FreePDF7~1
在FreePDF5上完成打印 - 0~FreePDF5~1
在FreePDF3上完成打印 - 0~FreePDF3~1
开始在FreePDF3上打印 - 0~FreePDF3~2
在FreePDF6上完成打印 - 0~FreePDF6~1
在FreePDF1上完成打印 - 0~FreePDF1~2
开始在FreePDF1上打印 - 0~FreePDF1~3
在FreePDF2上完成打印 - 0~FreePDF2~2
开始在FreePDF2上打印 - 0~FreePDF2~3
在FreePDF3上完成打印 - 0~FreePDF3~2
开始在FreePDF3上打印 - 0~FreePDF3~3
在FreePDF1上完成打印 - 0~FreePDF1~3
开始在FreePDF1上打印 - 0~FreePDF1~4
在FreePDF2上完成打印 - 0~FreePDF2~3
在FreePDF3上完成打印 - 0~FreePDF3~3
在FreePDF1上完成打印 - 0~FreePDF1~4