Posts by hunter_spike

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!

    Ich bin wieder da....

    Kann mir jemand das mit den Threads nochmal erklären?

    Mein Grundproblem ist, das verschiedene Funktionen parallel/gleichzeitig ausgeführt werden sollen.


    Aus den einzelnen Funktionen (im alten Programm) hab ich die Endlosschleifen gelöscht und hatte geplant, das ich das in "main" steuern kann.


    Bei unten stehendem Programm wird erst "EinlesenTemp" abgearbeitet, danach "EinlesenDI".

    Das sollte eigentlich schon gleichzeitig passieren....


    Danach (weil die beiden Variablen in der if-Schleife am Ende der Funktionen gesetzt werden) werden "VentilSoll" und "Ausgabe" abgearbeitet.

    Da das aber alles in der "while(1)"-Schleife steht, sollte das wiederholt werden. Wird aber nicht. ;(


    Ich muß doch mit "join" die threads beenden. Was mache ich falsch?

    Warum werden die in der Endlosschleife nicht mehr neu gestartet?

    goggle war nicht sehr hilfreich... und in meinen c++-Büchern steht rein gar nix von threads....



    Hier mein "main":


    Hier das komplette Programm:

    Verlöten ist gut. Und für die 40-polige Steckerleiste der Raspi gibt es passende 40-polige Stecker mit Schneidklemmen für Regenbogenkabel.


    (Wer nicht gleich drauf kommt: Regenbogenkabel hat die gleichen Farben wie die Ringe von Widerständen, also jede Farbe steht für eine Ziffer)

    Mit dem Debugger hab ich gestern Abend probiert. Bin ich auf die schnelle nicht mit klar gekommen.


    Ich hab statt dessen noch gefühlte 50 "cout" eingefügt.

    ... und man kann es kaum glauben: Ich hab einen Fehler gemacht! :D :D :D


    Bei der do..while Schleife in case habe ich die Abfrage im while nicht negiert.... Denkfehler....


    Danke erstmal für Eure Hilfe. :bravo2:


    Aber macht euch keine Sorgen: Ich bin noch lange nicht fertig. Ich melde mich bestimmt nochmal! :saint:

    Danke für eure Antworten und besonderen Dank fürs Einrücken!


    Ich hatte mir schon gedacht, das es besser wäre, aus "Ventil" eine Klasse zu machen. Aber das ist mir im Moment ein bisschen zu viel...


    Vor ein paar Jahren bin ich auf Code::Blocks umgestiegen, weil ich es wesentlich einfacher zu bedienen fand als geany...


    Aber darf ich nochmal auf meine Frage zurück kommen?


    In Zeile 222 (von _blackjack_ überarbeitetes Programm) steige ich in "case 2" ein (Weil Zeile 165 Ventil1soll=2).

    In der do...while Schleife (Zeile 224 bis 234) hänge ich so lange fest, bis "Ventil1ist" auf 2 steht. Das wird aber in Zeile 178/179 gesetzt, die nach meiner Auffassung gar nicht abgearbeitet werden sollte, da ich ja im case 2 fest hänge.


    Von mir aus soll es ja so funktionieren, wie es funktioniert. Aber von meinem Verständnis her sollte es so nicht funktionieren.....

    Ups: zur Sprache:

    Ich hab c++ eingestellt. Aber ich hab keine Klassen oder so gemacht. Von daher glaube ich, das da kein Unterschied ist....

    Nabend,

    ich versuche mal so viel wie möglich zu beantworten:


    Endlosschleife:

    Ja, ein paar Funkrionen laufen in Endlosschleife. Zum Einen, weil ich noch am Ausprobieren bin, zum Zweiten sollen ein paar Funktionen ja auch "unendlich" laufen. Zum Beispiel das Temperatur einlesen.


    join-Aufrufe:

    Die hab ich irgendwo so gesehen und einfach übernommen. Da die Funktionen danach gleichzeitig abgearbeitet wurden war ich stolz auf mich und hab mir keine weiteren Gedanken gemacht.


    Compiler-Aufruf:

    Jetzt wirds peinlich für mich...

    Ich arbeite mit Code::Blocks. Dort hab ich unter "Settings/Compiler/Linkler Settings" "usr/lib/arm-linux/gnueabihf/libpthread.so" eingetragen. Dort ist auch die wiringPi eingetragen. Meintest Du das?


    Einrückung/Formatierung:

    Ich hab das vor dem Posten extra nochmal überarbeitet.... ;(


    WiringPi:

    Ich hatte die vor ein paar Jahren schon mal benutzt. Deswegen hab ich das jetzt wieder gemacht. Was nimmt man denn heute?

    Hier das komplette Programm:

    Ich glaube, ich hab es selber gefunden....

    Ganz unten in "main" rufe ich ja "thread t1(Einlesen)" und "thread t4(Ventile)" auf.

    Kann es sein, das ich ganz viele "Einlesen" und "Ventile"-Funktionen am laufen habe???

    Ich steh mal wieder auf dem Schlauch...

    Kann mir jemand sagen warum das unten stehende Programm funktioniert???


    Ich hab mit Sternchen markiert, wo meine Endschalter eingelesen werden und in eine Variable geschrieben werden.

    Darunter wird die Variable "Ventil1ist" anhand der Endschalter bestimmt.


    Rund 10 Zeilen weiter unten ist eine do-while-Schleife, in der ich nach meiner Auffassung so lange festhänge, bis "ist" und "soll" gleich sind.

    Demnach dürften sich aber meine Eingangs-Variablen nicht mehr ändern, da ich die ja weiter oben beschreibe.

    Warum funktioniert das Programm trotzdem?

    Wenn ich "Ventil1soll" eine Zahl zwischen 1-3 gebe, dann fährt mein Motor ordentlich bis auf die gewünschten Nocken und bleibt da stehen.


    Um es übersichtlicher zu machen habe ich ganz viel rausgekürzt.

    Wenns hilft poste ich auch alle 250 Zeilen....

    Rechtsklick auf das RealVNC-Symbol in der Taskleiste, dann auf "File Transfer..." (auf Deutsch vermutlich Dateiübertragung oder ähnlich).


    Edit: und wieder zu spät...

    Trotzdem Danke!

    Wenn dabei gestanden hätte, das das Kontextmenü mit der rechten Maustaste geht, hätte ich nicht so dumm fragen brauchen.... :saint:


    Das Programm ist noch im Versuchsstadium. Darum ein paar Sachen auskommentiert, vielleicht was doppelt, und bestimmt Fehler drin...

    .....

    Auf einem Raspberry Pi 2 bin ich auf über 200 Threads gekommen. An der Anzahl der Threads wird das Vorhaben wohl kaum scheitern.

    Ups :huh: 8|

    Man soll eben nicht alles glauben, was man im Netz liest.

    Hatte mehrmals gelesen das die Anzahl der Kerne die Threads bestimmt.

    Bevor du ueber die Threadas nachdenkst solltest du verifizieren dass der Treiber fuer den DS18B20 ueberhaupt mehrere Threads gleichzeitig bedienen kann. Wenn der Treiber die Abfragen serialisiert hast du einfach eine Warteschlange vor dem Treiber...


    > Kann ich eine Funktion gleichzeitig aus verschiedenen Threads aufrufen?
    Kommt drauf an ob die Funktion reentrant ist.

    ich lese die Temperatursensoren nacheinander mit ifstream aus dem Verzeichnis "/sys/bus/w1/devices/"Sensornummer"/temperarure" aus.


    (wenn mir einer kurz erklärt wie ich eine Datei mit dem VNC-Viewer runter laden kann, könnte ich das Programm posten)

    OK.

    Um die 12 Bit hab ich mir keine Gedanken gemacht.

    Kurz gegoogelt würde ich dann grob 3 Sekunden statt 30 Sekunden für die Sensoren benötigen.

    Das werde ich später nochmal umstellen müssen, aber auch die 3 Sekunden sind zu lange, um die Endschalter der Motoren abzufragen. Somit muss ich mit Threads arbeiten, damit die Motorensteuerung parallel zur Datenerfassung läuft.

    Hallo Bernd,

    ich hab mich wohl zum Teil nicht richtig ausgedrückt.


    Ein Thread soll ganz gemütlich, alle 30 Sekunden, die Sensoren einlesen und die Werte ans Hauptprogramm übergeben.


    Ein anderer Thread schaltet einen Motor ein und wartet gespannt darauf, das der passende Endschalter kommt und er den Motor sofort ausschaltet.


    Sprache ist C++ .... wie dieses Forum....

    .....

    Ich hatte mal einen Link gehabt, mit dem man die Sonnenstunden für die eigene PLZ aufrufen konnte. Diese wurden dann im Explorer als Zahl dargestellt.

    ......

    Hallo axlnb,

    hast Du den Link noch irgendwo? Suche sowas schon länger. Wenn ich wüßte, ob morgen zur Mittagszeit bei mit zuhause die Sonne scheint, könnte meine termische Solaranlage vormittags in den Heizkreis einspeisen (40 Grad) und ab Mittag das Warmwasser heizen (80 Grad)

    Moin zusammen,

    ich bastel gerade für die Regelung der Pufferspeicher meiner Stückholzheizung eine neue Steuerung zusammen:


    Da das Einlesen von den DS18B20-Temperatursensoren rund 1 Sekunde pro Sensor benötigt, und ich im "Endstadium" rund 30 Sensoren haben werde, ist mir das ein bisschen lang. Ich muss Ventilmotoren zeitgenau anhalten, wenn sie einen Endschalter erreichen und ähnliches.


    Darum hab ich mich mit Threads beschäftigt:

    Die Raspberry Pi 3b hat vier Kerne. Ich kann also maximal 4 Threads gleichzeitig laufen lassen hab ich gelesen. Allerdings frage ich mich da, wo der Rest der Raspi (LXDE etc...) verarbeitet wird.


    Kann ich eine Funktion gleichzeitig aus verschiedenen Threads aufrufen?


    Zählt "this_thread" auch als thread? müsste ich den also bei die maximal 4 Threads beirechnen?


    Danke euch,


    Achim