www.mikrocontroller.net

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


Autor: Astrides (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.