首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BackgroundWorker中的吐温事件

BackgroundWorker中的吐温事件
EN

Stack Overflow用户
提问于 2019-12-03 15:47:45
回答 1查看 264关注 0票数 1

我有一个项目,在这个项目中,我使用背景工作者通过WIA2异步地从扫描仪执行扫描功能。它对WIA很有效。

现在,我正试图通过对吐温的扫描来做同样的事情。我可以用吐温扫描。但是,当我试图使它在后台工作时,我无法使它正常工作,因为TWAIN中的扫描事件有一个TransferImage处理程序和一个ScanningComplete事件处理程序,它们在扫描结束时会被触发。transferImage是好的,因为它不影响我的背景事件。但是,我希望访问scanningComplete事件中的面板,使其成为.Visible = False

发生的一件事:

代码语言:javascript
复制
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 = FalserBEScan.Visible = False有任何想法。

如果不可能,是否应该在TWAIN扫描页面的eventHandler中使用另一个后台工作人员。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-04 07:58:46

谢谢@JQSOFT,正如你说的那样,我必须使用一个委托子来处理面板的可见度。下面是对代码的修改:

代码语言:javascript
复制
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

我把它放在一个新的线程,后扫描功能,它运行良好。由于我在另一个类中使用了新线程,所以我也将新的委托子放入其中。

代码语言:javascript
复制
    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。

我已经张贴了答案,以防别人需要。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59160710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档