mikrocontroller.net

Forum: PC-Programmierung vb.net 2005 multithreading Problem


Autor: FPGA-Fragender (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich arbeite mit MS Visual Basic net 2005 und habe ein Programm erstellt, 
welches Daten von der High Speed USB Schnittstelle einliest und 
weiterverarbeitet. ( Achtung:  30 MByte / sec )

Hardware ist ein Cypress USB Baustein mit dazugehöriger dll, für vb.net 
vom Hersteller.

1. Ein einfaches Formular dient dazu das Einlesen zu starten / stoppen 
und eine Status Anzeige zu liefern.

2. Ein zusätzlich von mir generierter Worker Thread beschäftigt sich mit 
dem tatsächlichen einlesen der Daten und gibt in bestimmten Intervallen 
ein Update Aufforderung an das Formular, damit die Statusmeldung sich 
verändert.

Nun mein Problem:

Generieren von Threads / Beenden

Für die schnelle Datenübertragung muss ein überlappendes Schreiben/lesen 
erfolgen. Diese Technik, welche vom Treiber bereitgestellt wird läuft 
darauf hinaus, dass mehrere Prozesse gestartet werden und in einer Quewe 
abgearbeitet werden.

Dieses starten und beenden von Prozessen läuft nur, wenn diese Routinen 
vom Haupt-Thread ( also dem des Formulars ) gestartet werden.

Wenn ich versuche diese Routinen vom einem getrennten Worker Thread aus 
zu starten kommen immer wieder Fehler.

Werden die Routinen vom Formular Thread aus aufgerufen läuft alles 
bestens.

Also soll heißen:

1. Formular wird gestartet.
2. Button wird gedrückt
3. in der Button Service Routine werden in einer Schleife
 - die IO Threads initialisiert
 - die Threads zyklisch beendet und neu gestartet
 - Die Daten perfekt und schnell eingelesen

Alles läuft bestens

4. ABER das Formular reagiert dann allerdings auf KEINE weiteren 
Eingaben und gibt auch KEIN Status Update bis die Schleife abgearbeitet 
ist.

Wie kann ich machen, dass das Formular weiterhin Eingaben entgegennimmt, 
wenn ich jedoch die IO Schleife NICHT in einen eigenen Thread verlegen 
kann ?

Hab schon seeeehr viel probiert und komm einfach nicht weiter.

Bin für jeden Tipp und jeden Hinweis dankbar

Gruß vom FPGA-Fragenden

Autor: JojoS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie wird denn der Update gemacht? Ein Standardfehler ist es von einem 
anderen Thread aus direkt auf Controls zuzugreifen, das geht nicht. Man 
muss das mit Delegates umgehen. Die VB Syntax dafür habe ich nicht 
griffbereit, in C# geht das so:



        private delegate void UpdateControlsCallback();


        void UpdateControls()
        {
            if (InvokeRequired)
            {
                UpdateControlsCallback d = new 
UpdateControlsCallback(UpdateControls);
                this.Invoke(d);
            }
            else
            {

                txtPortValue.Text = portValue.ToString("x");
                cbBit0.Checked = (portValue & (1 << 0)) > 0;
                cbBit1.Checked = (portValue & (1 << 1)) > 0;
                cbBit2.Checked = (portValue & (1 << 2)) > 0;
                cbBit3.Checked = (portValue & (1 << 3)) > 0;
                cbBit4.Checked = (portValue & (1 << 4)) > 0;
                cbBit5.Checked = (portValue & (1 << 5)) > 0;
                cbBit6.Checked = (portValue & (1 << 6)) > 0;
                cbBit7.Checked = (portValue & (1 << 7)) > 0;
            }
        }

Autor: FPGA-Fragender (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo JojoS,

danke für Deine Antwort. Auf das Problem, dass man aus einem fremden 
Prozess nicht direkt auf die Controlls zugreifen kann, bin ich schon 
gestoßen. ( per Fehlermeldung )

Konnte ich auch ähnlich dem wie Du geschrieben hast lösen nur besteht 
das Problem,

=> dass das Formular, das upgedated werden soll tatsächlich nicht 
sichtbar upgedated wird, obwohl es von außen d.h. von einem fremdem 
Thread die Aufforderung dazu bekommt.

Warum nicht ? WEil es sich quasi NICHT im Ruhezustand befindet, sondern 
meine IO Arbeit als Schleife verrichtet. WEnn die Schleife beendet ist, 
was ja nicht geht, weil sie eigentlich unendlich laufen soll, nur DANN 
wird das Formular auch sichtbar ugedated.

Irgendwelche Tipps ?

Gruß vom FPGA-Fragenden

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit Application.DoEvents() in der Schleife sollte das funktionieren

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.