Forum: PC-Programmierung vb.net 2005 multithreading Problem


von FPGA-Fragender (Gast)


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

von JojoS (Gast)


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;
            }
        }

von FPGA-Fragender (Gast)


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

von Arc N. (arc)


Lesenswert?

Mit Application.DoEvents() in der Schleife sollte das funktionieren

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.