BackgroundWorker 中的 TWAIN 事件
TWAIN events in BackgroundWorker
我有一个项目,在这个项目中,我使用后台程序通过 WIA2 从扫描仪异步执行扫描功能。它适用于 WIA。
现在我正尝试通过使用 TWAIN 扫描来做同样的事情。我可以使用 TWAIN 扫描 ok。然而,当我试图让它在后台工作时,我无法让它正常工作,因为在 TWAIN 中扫描事件有一个 TransferImage 处理程序和一个 ScanningComplete 事件处理程序,它们在扫描完成时被唤醒。 transferImage 没问题,因为它不影响我的背景事件。但是我想在 scanningComplete 事件中访问一个面板,使其成为 .Visible = False
一段发生的事情:
Private Sub rBEScan_Click(sender As Object, e As EventArgs) Handles rBEScan.Click
rPScanning.Visible = True
Me.rBEScan.Enabled = False
bGWScan.RunWorkerAsync()
End Sub
Private Sub bGWScan_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bGWScan.DoWork
Dim path As String = ""
Dim correct As Boolean = False
If scanMode = 1 Then
correct = ScannerRead(path, 1)
Else 'TWAIN
images = Nothing
images = New List(Of System.Drawing.Bitmap)
correct = scanTWAIN(gLocalScanner, path)
End If
Dim obj As Object
obj = correct
e.Result = obj
End Sub
Private Sub bGWScan_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) _
Handles bGWScan.RunWorkerCompleted
Dim obj As Object
obj = e.Result
Dim lobj As Boolean
lobj = DirectCast(obj, Boolean)
rPScanning.Visible = False
Me.rBEScannerEskaneatu.Enabled = True
End Sub
Private Shared Function scanTWAIN(ByVal id As String, ByVal path As String) As Boolean ' prompt to scan more pages,
' SCAN TWAIN FUNCTION
AddHandler twain.TransferImage,
Sub(sender As Object, args As TwainDotNet.TransferImageEventArgs)
If (Not (args.Image Is Nothing)) Then
images.Add(args.Image)
End If
End Sub
' Re-enable the form after scanning completes
AddHandler twain.ScanningComplete,
Sub(sender As Object, e As TwainDotNet.ScanningCompleteEventArgs)
'Enabled = True
Dim lobj As String = ""
lobj = FuncionScanner.pdfIrudiraTwain(images, path, gLocalPreguntarRotacion, orritxurisep, orriDok, orriguztiakDok)
PrincipalR.rPScanning.Visible = False
PrincipalR.rBEScan.Enabled = True
End Sub
ScanningFunctionOfTwain With my settings.
End Sub
我的问题是我在扫描图像之前结束了后台工作程序,因为事件是在另一个异步调用的函数中处理和触发的。
知道如何放置 rPScanning.Visible = False
和 rBEScan.Visible = False
当后台工作人员中的事件结束时。
如果不可能,我应该在 TWAIN 中扫描页面的 eventHandler 中使用另一个 backgroundworker。
感谢@JQSOFT,
正如您所说,我必须使用委托子来处理面板可见性。这是代码中的更改:
Private Shared Function scanTWAIN(ByVal id As String, ByVal path As String) As Boolean ' prompt to scan more pages,
' SCAN TWAIN FUNCTION
AddHandler twain.TransferImage,
Sub(sender As Object, args As TwainDotNet.TransferImageEventArgs)
If (Not (args.Image Is Nothing)) Then
images.Add(args.Image)
End If
End Sub
' Re-enable the form after scanning completes
AddHandler twain.ScanningComplete,
Sub(sender As Object, e As TwainDotNet.ScanningCompleteEventArgs)
Dim objNewThread As New Thread(Sub() FuncionScanner.pdfTwainThread(images, path, gLocalPreguntarRotacion,
orritxurisep, orriDok, orriguztiakDok,
rPScanning, rBEScan))
objNewThread.IsBackground = True
objNewThread.Start()
End Sub
ScanningFunctionOfTwain With my settings.
End Sub
我已经把它放在一个新线程中的后扫描功能,它运行良好。
因为我在另一个 class 中使用了新线程,所以我也放置了新的委托子。
Public Shared Sub pdfTwainThread(ByVal lista As List(Of System.Drawing.Bitmap),
ByVal path As String, ByVal ori As Boolean,
ByVal orritxurisep As Boolean, ByVal orriDok As Boolean,
ByVal orriguztiakDok As Boolean,
ByRef rp As Telerik.WinControls.UI.RadPanel,
ByRef rb As Telerik.WinControls.UI.RadButtonElement)
Dim l As String = ""
l = pdfIrudiraTwain(lista, path, ori, orritxurisep, orriDok, orriguztiakDok)
panel_visible(False, rp, rb)
Dim txt As String = ""
Dim txt1 As String = ""
txt1 = Func_nombre(366)
If l <> "" Then
txt = Func_nombre(436)
MessageBox.Show(txt, txt1, MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
txt = Func_nombre(437)
MessageBox.Show(txt, txt1, MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
End Sub
Delegate Sub PanelV(vf As Boolean, ByRef rp As Telerik.WinControls.UI.RadPanel,
ByRef rbscan As Telerik.WinControls.UI.RadButtonElement)
Private Shared Sub panel_visible_hemen(ByVal vis As Boolean, ByRef rp As Telerik.WinControls.UI.RadPanel,
ByRef rbscan As Telerik.WinControls.UI.RadButtonElement)
If rp.InvokeRequired Then
Dim d As New PanelV(AddressOf panel_visible_hemen)
rp.Invoke(d, New Object() {vis, rp, rbscan})
Else
rp.SendToBack()
rp.Visible = vis
rbscan.Enabled = True
End If
End Sub
我将面板和 buttonElement byref 传递给我在委托子中更新的新函数。
非常感谢@JQSOFT 的帮助。
我有 post 答案,以防其他人需要。
我有一个项目,在这个项目中,我使用后台程序通过 WIA2 从扫描仪异步执行扫描功能。它适用于 WIA。
现在我正尝试通过使用 TWAIN 扫描来做同样的事情。我可以使用 TWAIN 扫描 ok。然而,当我试图让它在后台工作时,我无法让它正常工作,因为在 TWAIN 中扫描事件有一个 TransferImage 处理程序和一个 ScanningComplete 事件处理程序,它们在扫描完成时被唤醒。 transferImage 没问题,因为它不影响我的背景事件。但是我想在 scanningComplete 事件中访问一个面板,使其成为 .Visible = False
一段发生的事情:
Private Sub rBEScan_Click(sender As Object, e As EventArgs) Handles rBEScan.Click
rPScanning.Visible = True
Me.rBEScan.Enabled = False
bGWScan.RunWorkerAsync()
End Sub
Private Sub bGWScan_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bGWScan.DoWork
Dim path As String = ""
Dim correct As Boolean = False
If scanMode = 1 Then
correct = ScannerRead(path, 1)
Else 'TWAIN
images = Nothing
images = New List(Of System.Drawing.Bitmap)
correct = scanTWAIN(gLocalScanner, path)
End If
Dim obj As Object
obj = correct
e.Result = obj
End Sub
Private Sub bGWScan_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) _
Handles bGWScan.RunWorkerCompleted
Dim obj As Object
obj = e.Result
Dim lobj As Boolean
lobj = DirectCast(obj, Boolean)
rPScanning.Visible = False
Me.rBEScannerEskaneatu.Enabled = True
End Sub
Private Shared Function scanTWAIN(ByVal id As String, ByVal path As String) As Boolean ' prompt to scan more pages,
' SCAN TWAIN FUNCTION
AddHandler twain.TransferImage,
Sub(sender As Object, args As TwainDotNet.TransferImageEventArgs)
If (Not (args.Image Is Nothing)) Then
images.Add(args.Image)
End If
End Sub
' Re-enable the form after scanning completes
AddHandler twain.ScanningComplete,
Sub(sender As Object, e As TwainDotNet.ScanningCompleteEventArgs)
'Enabled = True
Dim lobj As String = ""
lobj = FuncionScanner.pdfIrudiraTwain(images, path, gLocalPreguntarRotacion, orritxurisep, orriDok, orriguztiakDok)
PrincipalR.rPScanning.Visible = False
PrincipalR.rBEScan.Enabled = True
End Sub
ScanningFunctionOfTwain With my settings.
End Sub
我的问题是我在扫描图像之前结束了后台工作程序,因为事件是在另一个异步调用的函数中处理和触发的。
知道如何放置 rPScanning.Visible = False
和 rBEScan.Visible = False
当后台工作人员中的事件结束时。
如果不可能,我应该在 TWAIN 中扫描页面的 eventHandler 中使用另一个 backgroundworker。
感谢@JQSOFT, 正如您所说,我必须使用委托子来处理面板可见性。这是代码中的更改:
Private Shared Function scanTWAIN(ByVal id As String, ByVal path As String) As Boolean ' prompt to scan more pages,
' SCAN TWAIN FUNCTION
AddHandler twain.TransferImage,
Sub(sender As Object, args As TwainDotNet.TransferImageEventArgs)
If (Not (args.Image Is Nothing)) Then
images.Add(args.Image)
End If
End Sub
' Re-enable the form after scanning completes
AddHandler twain.ScanningComplete,
Sub(sender As Object, e As TwainDotNet.ScanningCompleteEventArgs)
Dim objNewThread As New Thread(Sub() FuncionScanner.pdfTwainThread(images, path, gLocalPreguntarRotacion,
orritxurisep, orriDok, orriguztiakDok,
rPScanning, rBEScan))
objNewThread.IsBackground = True
objNewThread.Start()
End Sub
ScanningFunctionOfTwain With my settings.
End Sub
我已经把它放在一个新线程中的后扫描功能,它运行良好。 因为我在另一个 class 中使用了新线程,所以我也放置了新的委托子。
Public Shared Sub pdfTwainThread(ByVal lista As List(Of System.Drawing.Bitmap),
ByVal path As String, ByVal ori As Boolean,
ByVal orritxurisep As Boolean, ByVal orriDok As Boolean,
ByVal orriguztiakDok As Boolean,
ByRef rp As Telerik.WinControls.UI.RadPanel,
ByRef rb As Telerik.WinControls.UI.RadButtonElement)
Dim l As String = ""
l = pdfIrudiraTwain(lista, path, ori, orritxurisep, orriDok, orriguztiakDok)
panel_visible(False, rp, rb)
Dim txt As String = ""
Dim txt1 As String = ""
txt1 = Func_nombre(366)
If l <> "" Then
txt = Func_nombre(436)
MessageBox.Show(txt, txt1, MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
txt = Func_nombre(437)
MessageBox.Show(txt, txt1, MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
End Sub
Delegate Sub PanelV(vf As Boolean, ByRef rp As Telerik.WinControls.UI.RadPanel,
ByRef rbscan As Telerik.WinControls.UI.RadButtonElement)
Private Shared Sub panel_visible_hemen(ByVal vis As Boolean, ByRef rp As Telerik.WinControls.UI.RadPanel,
ByRef rbscan As Telerik.WinControls.UI.RadButtonElement)
If rp.InvokeRequired Then
Dim d As New PanelV(AddressOf panel_visible_hemen)
rp.Invoke(d, New Object() {vis, rp, rbscan})
Else
rp.SendToBack()
rp.Visible = vis
rbscan.Enabled = True
End If
End Sub
我将面板和 buttonElement byref 传递给我在委托子中更新的新函数。
非常感谢@JQSOFT 的帮助。
我有 post 答案,以防其他人需要。