我正致力于将应用程序变成一个"听众"各种各样的。该程序使用数据库中的数据处理ZPL运输标签模板的填写。我们有多个程序可以调用这个标签程序,除了一个之外的所有程序都有一个连接到PC的Zebra打印机,标签程序会检测到这些程序并在完成填充后自动打印标签。
在另一个应用程序中,即用户拥有可穿戴终端和无线Zebra标签打印机的拣选程序,它会导致问题。标签程序通过队列/堆栈表知道要处理什么,其中条目链接到填充队列的机器名称。在拾取程序中,而不是将ZPL发送到打印机的标签程序,它是'将ZPL写入文件,以便拣选程序可以读取ZPL并修改无线斑马的命令。
在标签程序运行并创建包含ZPL的文本文件后,我在拾取程序中遇到了问题。对于一些客户,标签程序可以将最多4个ZPL写入同一个文件中,并且我需要在拾取程序中知道它何时完成对文件的写入并且文件已准备好进行读取。现在我正在检查机器的标签队列是否为空,但该文件始终无法打开。
我的代码如下。我基本上需要找到一些知道何时完成文件写入并准备好读取的方法,但我需要考虑标签程序可能会出错并且根本不会写文件。
StartPrintLabelListener()只是启动标签程序(如果它尚未运行),CheckCartonLabelQueueEmpty()检查队列表中是否没有用户记录,返回布尔值。正如您在下面所看到的,我最近克服文件尚未准备好的尝试包括一个延迟1/10秒的循环,每次迭代都要进行几次检查(如果生成时需要太长时间)文件,将发生错误。)
Private Sub PrintLabel(strCartonID As String)
Try
Dim drCH As OracleDataReader = selectCartonInformation(strCartonID)
Dim dteDateModified As DateTime = Nothing, dteNewDateModified As DateTime = Nothing
Dim strTmpFileName As String = "C:\tmp\tmplabel.zpl"
If System.IO.File.Exists(strTmpFileName) Then
dteDateModified = System.IO.File.GetLastWriteTime(strTmpFileName)
System.IO.File.Delete(strTmpFileName)
End If
If drCH.Read Then
'insert the carton into the queue to be printed
insertCartonLabelQueue(Convert.ToInt32(drCH.Item("SKLC_CH")))
End If
'start the print label listener if it isn't running for this user already
StartPrintLabelListener()
'now that the print label program is running, keep checking the SKLC_CARTONLABELQ to see if the label finished processing or until tmrLabelTimer elapses
Dim intLabelTimer As Integer = 0
Dim blnPrintLabelComplete As Boolean = False, blnCartonLabelQueueEmpty As Boolean = False, blnFileExists As Boolean = False, intFileExistsCheck As Integer = 0
While Not blnPrintLabelComplete And intLabelTimer < 20000
If Not blnCartonLabelQueueEmpty Then
blnCartonLabelQueueEmpty = CheckCartonLabelQueueEmpty(Convert.ToInt32(drCH.Item("SKLC_CH")))
End If
If System.IO.File.Exists(strTmpFileName) Then
intFileExistsCheck += 1
End If
blnFileExists = (intFileExistsCheck > 3)
If blnCartonLabelQueueEmpty And blnFileExists Then
blnPrintLabelComplete = True
End If
intLabelTimer += 100
System.Threading.Thread.Sleep(100)
End While
'if blnPrintLabelComplete is set to true, vbPrintLabel processed the label. check the tmp file attributes to be sure it's actually a new file
If blnPrintLabelComplete Then
If System.IO.File.Exists(strTmpFileName) Then
dteNewDateModified = System.IO.File.GetLastWriteTime(strTmpFileName)
End If
If dteNewDateModified = Nothing Or (Not dteNewDateModified = Nothing AndAlso Not dteDateModified = Nothing AndAlso dteNewDateModified <= dteDateModified) Then
Throw New PrintLabelException("An error has occurred while generating the label.")
End If
If Not ZebraPrinter.PrintTmpFile(CurPicker.UserName) Then
Throw New PrintLabelException("An error has occurred while printing the label.")
End If
Else
deleteCartonsFromQueue(intSessionID)
Throw New PrintLabelException("An error has occurred while generating the label.")
End If
Catch ex As Exception
If TypeOf (ex) Is PrintLabelException Then
Throw
Else
Throw New PrintLabelException("An error has occurred while printing the label.", ex)
End If
End Try
End Sub