Forum: PC-Programmierung Warum läuft mein Programm so langsam ??? deviceiocontrol???


von Astrides (Gast)


Lesenswert?

Hallo,

ich habe da ein programm in VB .NET geschrieben das mir helfen sollte
packete zu meinem gerät zu schicken oder welche von ihm zu empfangen

es läuft einigermaßen (das schicken zumindest! das empfangen ist sehr
langsam bzw. geht gar nicht)! ich kann kontakt zu meinem gerät
aufnehmen aber wenn ich packete empfangen möchte (methode getPacket())
dann dauert es so lange dass ich mein programm doch abbrechen muß

ich habe ein breakpoint gesetzt um zu sehen wo es hängen bleibt und da
habe ich gemerkt dass es bei der methode deviceiocontrol() in
getPacket() hängt

warum denn? ich verstehe das nicht!
kann mir jemand helfen? mein gerät ist per USB angeschlossen

hier mein code:

    sub main()

        SendPacket(theStartSessionPacket) // schicken läuft

        Do
            thePacket = GetPacket() //// Empfangen schläft fehl! Ab
hier läuft mein Programm nicht mehr bzw. sehr sehr langsam denn es geht
nicht weiter///////

            If thePacket.Type = 0 And thePacket.PacketId = 6 Then
                Exit Do
            End If
        Loop
    end sub

    Public Function GetPacket() As GarminPacket
        Dim buffer As List(Of Byte)
        Dim bufferSize As Integer

        Dim data As Byte()
        Dim dataSize As Integer

        Dim packet As GarminPacket

        buffer = New List(Of Byte)

        Do
            data = New Byte(ASYNC_DATA_SIZE - 1) {}

            ///////////------------dieser Aufruf ist der grund warum
mein programm ziemlich langsam läuft bzw. gar nicht! muß ich immer
selber abbrechen-------------/////////////
            DeviceIoControl(hDevice, IOCTL_ASYNC_IN, IntPtr.Zero, 0,
data, ASYNC_DATA_SIZE, dataSize, IntPtr.Zero)

            bufferSize += dataSize

            buffer.AddRange(New List(Of Byte)(data).GetRange(0,
dataSize))

            If dataSize = ASYNC_DATA_SIZE Then Exit Do
        Loop

        If buffer.Count > 0 Then
            packet = New GarminPacket()
            packet.Deserialize(buffer)

            If packet.Type = 0 And packet.PacketId = 2 Then
                ' DataAvailable ...

                packet = Nothing

                data = New Byte(MAX_BUFFER_SIZE - 1) {}
                dataSize = 0

                ReadFile(hDevice, data, MAX_BUFFER_SIZE, dataSize,
IntPtr.Zero)

                If dataSize > 0 Then
                    buffer = New List(Of Byte)(data).GetRange(0,
dataSize)

                    packet = New GarminPacket()
                    packet.Deserialize(buffer)

                    Return packet
                End If
            Else
                Return packet
            End If
        End If

    End Function

von Wolfram (Gast)


Lesenswert?

>           ///////////------------dieser Aufruf ist der grund warum
>mein programm ziemlich langsam läuft bzw. gar nicht! muß ich immer
>selber abbrechen-------------/////////////
>            DeviceIoControl(hDevice, IOCTL_ASYNC_IN, IntPtr.Zero, 0,
>data, ASYNC_DATA_SIZE, dataSize, IntPtr.Zero)

auch ohne deinen gesamten Programmcode gesehen zu haben, der Aufruf
kann nur vor den Baum gehen. Schau dir nochmal die Spezifikation der
Funktion an und was du als Strukturen übergibst. Ich finde es außerdem
relativ mutig den Fehlercode nicht auszuwerten,sondern einfach
anzunehmen das es geklappt hat.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.