Forum: PC-Programmierung mySQL - Polling/Interrupt in C?


von JK (Gast)


Lesenswert?

Hallo Leute!

Es geht nun mal wieder um mein Projekt, was ihr hier in der Rubrik 'µC & 
Elektronik' hier nachlesen könnt: "Wohnungssteuerung - Gießroboter"

Und zwar habe ich jetzt soweit das PHP-Skript mit einem Button, welches 
nach dem Klick in die mySQL-Datenbank einen Wert schreibt.
Daraufhin überprüft das C-Programm, ob denn dieser Wert in der 
mySQL-Datenbank vorliegt und schickt dann ein Zeichen über die Serielle 
Schnittstelle an meinen AVR.

Nun ist der nächste Schritt, nicht mehr durch "händisches Polling" 
(indem man das C-Programm desöfteren ausführt und darauf wartet, dass 
auf den Button im PHP-Skript geklickt wurde) die mySQL-Datenbank 
abzufragen.

Und genau darum gehts jetzt :-)

Wie kann ich in meinem c-Programm entweder einen Interrupt auslösen 
lassen, sobald ein bestimmter Wert in der mySQL-Datenbank vorliegt, dass 
er eine bestimmte Subroutine ausführt (z.B. "sende Zeichen über RS232") 
oder wie kann ich "ressourcenschonend" diese mySQL-Datenbank pollen?

Erfahrungsgemäß wäre eine while(1)-Schleife wohl das "einfachste", 
allerdings ist dies mit Sicherheit nicht das eleganteste, da mein 
Programm ja nebenher auch noch Messwerte liefern und diese in eine 
andere mySQL-Tabelle schreiben soll.

Ich bräuchte praktisch einen zweiten Thread, der immer nach dem Zustand 
des mySQL-Wertes schaut, währenddessen aber auch noch Messwerte z.B. vom 
Mikrocontroller entgegennimmt.

Wisst ihr was ich meine?
Leider kenne ich bisher solche Sachen nur aus der Mikrocontroller-Welt, 
beispielsweise beim Tastendruck-Abfragen. Zumal es bei Mikrocontroller 
eben einen Hardware-Interrupt-Eingang gibt.

Wie ist das beim PC?



Vielen Dank!

Gruß
Joh.

von Peter (Gast)


Lesenswert?

leider gibt es soche möglichkeiten nicht im SQL-Standard. Es gibt 
datenbanken dort kann man sich für events registrieren (borland) aber 
für MySql kenn ich nichts. Warum kannst du nicht von dem PHP direkt eine 
Nachricht an das C Programm schicken?

von JK (Gast)


Lesenswert?

Hey,

ich möchte es mit mySQL machen, da ich die Messwerte vom Controller 
später sowieso in einer mySQL ablegen möchte. Von daher...

von JK (Gast)


Lesenswert?

Werde mal anfangen, mich in die Threadprogrammierung einzulesen.

Werde dann per Thread alle Sekunden einmal auf die DB zugreifen und 
einlesen, ob sich was geändert hat.



Gruß

von Peter (Gast)


Lesenswert?

JK schrieb:
> ich möchte es mit mySQL machen, da ich die Messwerte vom Controller
> später sowieso in einer mySQL ablegen möchte. Von daher...

das kannst du ja zusätzlich machen und wenn du sie eingetragen hast 
kannst du über einen anderne weg dem C programm eine Nachricht schicken.

von JK (Gast)


Lesenswert?

Du meinst sozusagen einen Event auslösen, sobald eine Änderung vorliegt?


Wie funktioniert das genau??

von JK (Gast)


Lesenswert?

Soo...wunderbar :)

Ich habe es geschafft mittels Thread in C :)

von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

JK schrieb:
> Werde dann per Thread alle Sekunden einmal auf die DB zugreifen und
> einlesen, ob sich was geändert hat.

Ist zwar schon zu spät:
Für solche Sachen hab ich mir überlegt, die gewünschte Anwendung per PHP 
+ Parameter zu starten. (So ne Art Silent-Switch) Falls das nicht geht, 
weil die App schon rennt, oder nicht nochmal ausgeführt werden darf: 
Eine zweite App schreiben, die von PHP aufgerufen wird, und dann per 
Localhost-Socket oder sonnst wie mit der ersten App kommuniziert und 
etwas aufruft. So hat man nahezu verzögerungsfreie Events, spaart 
Performance, und anstelle von der Localhost-Vebindung, kann es auch ein 
anderer Cluster oder Server sein, wo die erste App rennt!!!

Ich bauch das sehr oft, auch für Haus-Automatisierung.. Gibts noch ne 
andere und vielleicht bessere Idee?

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.