Probleme mit Thread
-
evi48 schrieb:
Hallo Tom7,
das sieht für mich so aus als würdest du die While-Schleife mit allem was der PC hergibt durchlaufen.void __fastcall ControlProcess::Execute(){ while(bLoop){ Control(); Synchronize(UpdateLabel); } }Da kann die Anzeige nicht mitkommen und dein Programm läuft nicht. Junix hat mich auch zu diesem Problem in diesem Thread angesprochen. Du mußt die Anzeige von dem Messthread entkoppeln. Soll heissen dein Messthread schreibt die Daten in einen Puffer auf den dein Anzeigethread zugreifen darf (geschützter Bereich), aber mit einer total anderen Frequenz läuft wie dein Messthread.
evi48
Ja genau so hab ich's gelöst wenn ich nur mit einem Thread arbeite, und mit allem was der PC hergibt, ganz stimmts nicht, weil er immer wieder warten muss bis die Platine den Wert zurückgegeben hat, dauert mitunter mal 1-2 Sekunden. CPU Auslastung unter 20%. Aber mein eigentliches Problem warum funkt das mit den 2 Thread's nicht ich hab doch die Initialisierung richtig oder?
Im Thread kann ich doch dann ruhig wieder eine While Schleife durchlaufen oder, hängt da der eine den anderen Thread auf?
Könntest mir nicht a bissl auf die Sprünge helfen, mit den Threads hab ich leider noch nicht so viel erfahrung
-
evi48 schrieb:
nein natürlich nicht mit 100Hz anzeigen so schnell kann man sicher nicht kucken. Ich wollte nur sagen, daß das abtasten mit der Frequenz möglich ist.
Die Abtastfrequenz hängt lediglich von 2 Faktoren ab: Eingangsgeschwindigkeit, sowie Ausgabegeschwindigkeit. Wenn du zwischen Eingabe und Ausgabe nen grossen Puffer klatschst, der schnell ist, erreichst du auch Abtastraten erheblich über 100Hz...
Der Trick dabei ist eigentlich, das dann für die Anzeige einzelne Werte übersprungen werden und z.B. aber für einen Dump in ein File aus dem Datenpuffer ausgelesen wird.
-junix
-
Auf die Sprünge helfen gern nur weiß ich im Moment nicht so wirklich wie du die beiden Threads gekoppelt hast.
ControlProcess::Execute ist der Messthread und Synchronize(UpdateLabel); ist eine Funktion im WProcess-Thread, die du aus dem Messthread aufrufst? Ich kann mir nicht voerstellen daß das funktioniert.
Du benötigst zwei unabhängige Threads die sich einen geschützten Datenbereich teilen. Der Messthread darf schreiben und der Anzeigethread darf nur lesen.
Wenn du zwischendurch 1 bis 2 Sekunden Zeit hast sollte das kein Problem sein vor allem wenn du junix Hinweis mit dem Puffer umsetzt.
Ich habe bisher noch nie eine While-Schleife sich selbst überlassen auch nicht in einem Thread. Innerhalb der While-Schleife habe ich immer "WaitForMultipleObjects (API)" oder "WaitFor (aus TEvent)".
In deinem Fall würde ich das so regeln, daß der Messthread, z.B. über TEvent, den Anzeigethread für einen Durchlauf startet. Wie oft die Anzeige erneuert werden soll würde ich vom menschlichen Auge abhängig machen, denn bei einer Anzeige die mit 10Hz erneuert wird sind die Werte schon schwer auseinander zu halten.
evi48
-
Ja danke werd mal fleißig weiter probieren, irgendwann wird mir schon ein lichtlein aufgehn. Nur um mal ein Missverständniss aus der Welt zu räumen.
Lösung mit 1 Thread (funktioniert):
void __fastcall ControlProcess::Execute(){ while(bLoop){ Control(); Synchronize(UpdateLabel); } }Lösung mit 2 Thread's:
void __fastcall ControlProcess::Execute(){ while(bLoop) Control(); } //---Thread 2 -> lies nur die Werte die der ControlProcess in die Variablen geschrieben haben void __fastcall WriteProcess::Execute(){ while(bLoop) Synchronize(UpdateLabel); }wahrscheinlich wird's eh an den while Schleifen liegen -> hab's aber leider nur so gezeigt bekommen.

Danke vorerst mal,
mfg
Tom
-
Ja das ist doch schon der richtige Ansatz, aber die Schleifen laufen ständig durch das würde ich noch abstellen.
Wie oft ändern sich die zu Messenden Werte. Ich nehme mal z.B. an mit 40Hz. Dann lässt du den Messthreah mit 80Hz laufen. Auf diese Weise kannst du sicher sein jeden Wert zu erwischen. Der Anzeigethread läuft z.B. mit 5Hz.
Dann sollte es eigentlich gehen
evi48
-
evi48 schrieb:
Ja das ist doch schon der richtige Ansatz, aber die Schleifen laufen ständig durch das würde ich noch abstellen.
Wie oft ändern sich die zu Messenden Werte. Ich nehme mal z.B. an mit 40Hz. Dann lässt du den Messthreah mit 80Hz laufen. Auf diese Weise kannst du sicher sein jeden Wert zu erwischen. Der Anzeigethread läuft z.B. mit 5Hz.
Dann sollte es eigentlich gehen
evi48
Ok, danke so weit mal, ich muss jetzt wieder mal bissl probieren.
THX
Tom
-
Achja:
Tom7 schrieb:
while(bLoop){Schau dir mal vielleicht die Mehtode TThread::Terminate und die zugehörigen Properties an...
-
ok mach ich, danke für den Tipp
-
Die Platine ist von unserer Firma, genauer gesagt von meinem Vorgänger selbst entwickelt und beherberg einen µC509.
Die Platine hat 16 Relais 16 Digitale Eingäge, 8 Analoge Eingägne, 8 Analoge Ausgänge + nochmal 16 digitale Eingänge.
Das ganze kann über 2 verschiedene Protokolle angesprochen werden die sich in der Syntax komplett voneinander unterscheiden (Protokolle sind auch selbst entwickelt).
Die Kommunikation findet entw. über CAN oder COM statt.
Beantwortet das deine Fragen?Hallo Tom7,
nein, ich würde gerne wissen was du mit der Peripherie der Karte genau machst.
Da das Ding Ein sowie Ausgänge hat, kann ich mir vorstellen das du mit den
Ausgängen einen Test vorgibst und das Ergebniss über die Eingänge ausliest.
-
Hallo Tom7,
nein, ich würde gerne wissen was du mit der Peripherie der Karte genau machst.
Da das Ding Ein sowie Ausgänge hat, kann ich mir vorstellen das du mit den
Ausgängen einen Test vorgibst und das Ergebniss über die Eingänge ausliest.Ja, genau das ist der Fall, denn dann kann ich wirklich feststellen ob die I/O's einwandfrei funktionieren und bei den Relais seh ich eh ob sie schalten oder nicht.
-
Hallo,
und was ist nun mit dem Thread?
-
hi, sorry!
Mittlerweile läuft alles super, ich frag nun im Thread nicht mehr auf bLoop ab sondern auf !Terminated und beend ihn mit Terminate.