Jump to content
sergiofer

Erro em background worker

Recommended Posts

sergiofer

Boa noite a todos

 

Já faz algum tempo que não apareço. O trabalho tem esgotado todo o tempo.

E é sobre um projecto que estou a trabalhar que eu tenho o seguinte problema:

Tenho uma DLL feita e c++, que eu não conheço o código, mas que estou a utilizar em vb.net, dentro de um Module. A defenição das funções é a seguinte:

    <DllImport("EnrUTSLK.dll", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Ansi)>
    Private Function SaveImage(<MarshalAs(UnmanagedType.LPStr)> ByVal pstrPath As String, <MarshalAs(UnmanagedType.LPStr)> ByVal pstrFileName As String, ByVal nPanel As Integer, ByVal nImageType As Integer) As Int16
    End Function

Isto funciona bem se utilizar a função na thread principal, mas eu pretendo utilizar esta função num Backgroundworker, e quando faço isso, tenho o seguinte erro:

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Alguém tem ideia do que esta a correr mal?

Muito obrigado pela ajuda

Share this post


Link to post
Share on other sites
sergiofer

Dentro do Module tenho a seguinte função

   Public Function RvwSaveImage(ByVal path As String, ByVal camera As Integer, ByVal Tipo As Integer)
        Dim nRet As Integer = -100
     
        Try

            If (path.Contains(".bmp") Or path.Contains(".jpg")) Then

                Dim nIndex As Integer = path.LastIndexOf("\")
                Dim fileName As String = path.Substring(nIndex + 1)
                Dim myPath As String = ""

                If (nIndex >= 0) Then
                    myPath = path.Substring(0, nIndex)
                End If

                'nRet = SaveImage(myPath, fileName, camera, 1)
                nRet = SaveImage(myPath, fileName, camera, Tipo)

            End If

        Catch
            Return -100

        End Try

        'return SaveImage(pstrPath, pstrFileName, nPanel, nImageType);
        Return nRet

    End Function

No DoWork do backgroundworker, tenho um ciclo Case, com o seguinte código

          Case "SaveImage"

                            result = -100

                            Threading.Thread.Sleep(1000)

                            If Param1 <> "" And Param2 <> "" And Param3 <> "" Then
                                Do While result = -100
                                    Dim Hora As String = Date.Now
                                    Hora = Replace(Hora, "-", "")
                                    Hora = Replace(Hora, " ", "")
                                    Hora = Replace(Hora, ":", "")

                                    ' Param1 = Param1 + Hora + "_" + Serial + ".bmp"
                                    Param1 = Param1 + Model + "_" + Serial + ".bmp"


                                    result = Module1.RvwSaveImage(Param1, Param2, Param3)

                                  '  Dim r As ModuleHandle = RearView.RvwSaveImage(Param1, Param2, Param3)

Quando executo o mesmo código fora do background funciona bem, dentro do background dá erro.

Share this post


Link to post
Share on other sites
sergiofer

O erro que dá:

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Share this post


Link to post
Share on other sites
bioshock

Bem, já fizeste debugging para ver de onde surge o problema?

O erro que recebes é no module?

Share this post


Link to post
Share on other sites
sergiofer

O erro aparece quando executa a função do module, na linha

result = Module1.RvwSaveImage(Param1, Param2, Param3)

Share this post


Link to post
Share on other sites
sergiofer

Boa noite a todos

Estive a tentar resolver o problema, e penso que consegui. O problema estava no facto de eu não inicializar a dll dentro do backgroundworker. Passei a inicializar a dll dentro do backgroundworker, e penso que o problema está resolvido.

Agora tenho outro problema, ao fim de algum tempo, obtenho um erro de "Out of Memory", penso que isto deve ter a ver com o facto de estar a inicializar a DLL, de 100 em 100ms.

Alguém tem alguma ideia de como resolver isto?

Obrigado desde já

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.