Autor Beitrag
Daimonion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Do 20.12.07 17:16 
Hoi

Irgendwie ist die Thematik geradezu diletantisch aber ich komm noch nicht so richtig mit den Gedanken klar.

Bevor ich mein Problem schildere und auf eure Meinung hoffe, möchte ich mal kurz meine Umgebung anreißen.

Ich hab einen PC der ein Schrittmotorkarte enthält. Diese Karte hat ein Hochspracheninterface und ich kann aus meiner Applikation heraus diverse Funktionen aufrufen. So kann ich zum Beispiel diverse Eingänge oder unterschiedliche Statusabfragen durchführen indem ich die zugehörige Funktion aufrufe und dann die Ergebnisse in meiner Applikation verarbeiten kann.

Hier mal ein kurzer Auszug um eine Variable zu lesen.

ausblenden Delphi-Quelltext
1:
rdaxstb(achsennummer, Wert)					


Damit kann ich zum Beispiel ein Bit auslesen, welches mir anzeigt, ob die gewählte Achse noch ein Profil verfährt, oder nicht mehr.

Nun vielleicht etwas mehr zu meinem Problem.

Momentan sind diverse Verfahrprozeduren realisiert und unter bestimmten Umständen tritt der Fall ein, dass ich die Achsen mittels einer Funktion des Hochspracheninterface stoppe.

ausblenden Delphi-Quelltext
1:
js(Achsennummern); //stoppe die Achsen					


Da die jeweiligen Achsen generell in ihrem Trapezprofil verfahren, bremsen sie sich mittels der angegebenen Verzögerungsgeschwindigkeit ab. Dies dauert, wie man sich denken kann, eine gewisse Zeitspanne (sagen wir mal 100 ms)

Während dieser Zeit darf ich keine anderen Verfahrdatensätze starten. Um sicherzustellen das die jeweiligen Achsen wirklich stehen, kann ich die oben angebene Prozedur aufrufen und die Variable auswerten um festzustellen ob die Achse schon steht.

Zum einen kann ich das ja mittels aktivem Warten machen

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Wert := 0;
while Wert = 0 do begin
      rdastb(Achsennummer,Wert);
      sleep(50);
end;


Wie wir hoffentlich auch alle Wissen ist diese Art des Wartens doch sehr Prozessorbelastend und ich bin auf der Suche nach einer Alternative, die mir den Prozessor schont.
Bei der Suche nach diesen Alternativen stolpere ich allerdings immer über die Tatsache das mir nichts einfällt, wie man die ganze Geschichte Prozessorsparender gestalten kann.

Ich hab schon einen Watchdogthread laufen, aber der macht im Endeffekt auch nichts anderes als die Signale auszuwerten und über Funktionsaufrufe im Hauptprogramm irgendwelche Bits zu setzen. Im Hauptprogramm selbst muß ich dann aber wieder diese Bits mittels aktivem Warten überwachen.

Hoffe ihr habt mein Anliegen verstanden und könnt mir weiterhelfen. Sind ja doch einige Käpsele hier. ;)

Grüße

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt

_________________
Zitat Stromberg S03E08 - Erika:
"So...selbst die Capitolmatratze, die hier auf jedem Karosseplan umgerutscht ist, was will sie von mir? Zahlen. Aber so ist das. Als Chef in meiner Position, da bist du so einsam wie...Gott."
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 20.12.07 17:24 
Moin!

Schau mal hier, damit solltest du weiter kommen. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Daimonion Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Do 20.12.07 18:37 
Hallo Narses.


Besten Dank für den Link. Ich werd mir die dort geschriebenen Zeilen durch den Kopf gehen lassen und später berichten, inwieweit mir dieser Beitrag geholfen hat. Vielversprechend sieht er schon mal aus ;)

Grüße

_________________
Zitat Stromberg S03E08 - Erika:
"So...selbst die Capitolmatratze, die hier auf jedem Karosseplan umgerutscht ist, was will sie von mir? Zahlen. Aber so ist das. Als Chef in meiner Position, da bist du so einsam wie...Gott."
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Fr 21.12.07 11:37 
Also ich muss gestehen, dass ich nicht genau weiß was diese Karte macht deswegen besteht ein gewisses Risiko, dass ich Falsch liege und Schwachsinn erzähle. ;)

Warum ist ein while sleep Code Prozessorbelastend? Das Sleep sorgt dafür, dass dein Thread such schlafen legt und andere Threads arbeiten können. Und sei es nur der Thread des Leerlaufprozesses der die CPU schlafen legt. Das Einzige was CPU Schonender wäre, wenn du mittels Event oder Callback über das Ende der Operation informiert werden würdest. Aber das gibt es vermutlich nicht.

Zu dem Code aus der DP: Ich bezweifel wirklich, dass er dir viel helfen wird. Denn man sollte sich dazu auch mal das verlinkte original Posting anschauen. Im Vergleich dazu ist diese Methode wirklich schonender. Aber die Abarbeitung von Windowsbotschaften (Application.ProcessMessages) ist ja kein Bestandteil von dir. Zu mindest in deinem Code nicht. Und von daher würde der Code im Vergleich zu einem simplen Sleep lediglich dazu führen, dass dein Fenster reagieren würde. Du müsstest aber trotzden die externen Werte manuell abfragen. Ein vorzeitiges Abbrechen des Sleeps würde also nicht bzw. lediglich für Windowsbotschaften statt finden. Zusätzlich wäre so aber auch noch das Handling eines Events was bei einem Sleep nicht der Fall wäre.

Ich würde evtl. sogar empfehlen die Zeit etwas zu verkürzen. Wenn die Bibliothek nicht viel Rechenleistung braucht um den Wert abzufragen, dann kannst du auch ein Sleep von 1-10 benutzen. Denn so würdest du nicht immer mindestens 50ms Warten müssten. Und ob du 20 oder 1000 simple Abfragen hast stört eine CPU gar nicht. Und eigentlich ist so etwas auch ein nicht unüblicher weg.

Wenn deine Anwendung dabei aber nicht einfrieren soll, dann würde ich eher sagen, dass du die Zugriffe auf die Bibliothek in einen Thread auslagern solltest. Denn genau dafür sind Threads ja da. Der Weg über Application.ProcessMessages bringt nicht nur Vorteile. Er birgt auch einige versteckte sehr merkwürdige Verhaltensweisen. Mit einem Thread würdest du Befehle an ihn reichen und er würde sie abarbeiten und wenn nötig warten etc. Deine Anwendung wäre die ganze Zeit über flüssig bedienbar und der Thread wäre am Arbeiten. Allerdings würde ich zu Threads nur rate, wenn die Operationen zeitnah erledigt werden müssen und evtl. etwas länger dauern können. Also wenn deine Anwendung immer wieder stocken würde obwohl sie es nicht tun sollte. Ansonsten könnte es passieren, dass du dir mit einem Thread mehr Probleme als Vorteile an Land ziehst.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.