Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Zatrzymanie pętli przyciskiem?
mix091
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 5.12.2015

Ostrzeżenie: (0%)
-----


Dzieńdobry (IMG:style_emoticons/default/smile.gif)

Mam na swojej stronie dwa guziki: uruchom i zatrzymaj. Chciałem zrobić tak, aby po wciśnięciu guzika uruchom zaczęła wykonywać się pętla while, której warunkiem zatrzymania miało by być wciśnięcie klawisza zatrzymaj. Chciałem to zrobić na takiej zasadzie, że po wcisnieciu buttona zatrzymaj ustawi się w nim zmienna logiczna $stop na true i pętla while sie zatrzyma jeżeli $stop jest inne niż false. Oto kod którym próbowałem to zrobić

  1. if (isset($_POST['zatrzymaj']))
  2. {
  3. $stop = true;
  4. }
  5. if (isset($_POST['uruchom']))
  6. {
  7. $dtemp = $_POST['docelowaTemp'];
  8. while ($stop == false)
  9. {
  10. // Kod petli
  11. }
  12. }


Ale mi to nie działa i coś mi się wydaje, że takie coś nie ma prawa działać. Jak wykonać takie zatrzymanie pętli?
Pomocy (IMG:style_emoticons/default/sad.gif)

Ten post edytował mix091 5.12.2015, 23:46:27
Go to the top of the page
+Quote Post
SzpaaQ
post
Post #2





Grupa: Zarejestrowani
Postów: 19
Pomógł: 1
Dołączył: 22.11.2015

Ostrzeżenie: (0%)
-----


chyba nie w php
możesz ew w js napisać funkcje która będzie odświeżać plik .php i zatrzymać ją przyciskiem
Go to the top of the page
+Quote Post
mix091
post
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 5.12.2015

Ostrzeżenie: (0%)
-----


Ale tu też pojawia się pytanie, jak zatrzymać funkcję js przyciskiem?
Go to the top of the page
+Quote Post
Terrorizer
post
Post #4





Grupa: Zarejestrowani
Postów: 345
Pomógł: 3
Dołączył: 31.03.2012

Ostrzeżenie: (0%)
-----


Raczej w taki sam sposób, tylko zamiast isset $_post robisz sobie onClick do przycisku
Go to the top of the page
+Quote Post
Tomplus
post
Post #5





Grupa: Zarejestrowani
Postów: 1 884
Pomógł: 231
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


Powiedz mi jak chcesz zatrzymać pętle w PHP która trwa zwykle szybciej niż kliknięcie przycisku? Nawet jakby się dało. Kliknięcie musiałoby powodować na serwerze polecenie kill process, a do tego PHP nie ma dostępu. Wykonanie polecenia dzieje się po stronie serwera.

Nawet przez JS nie zrobi się czegoś takiego. Chyba ze JS będzie przetwarzał i wyniki krokowo, będzie wysyłał do skryptu PHP (która nie ma już takiej pętli.)

Go to the top of the page
+Quote Post
mix091
post
Post #6





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 5.12.2015

Ostrzeżenie: (0%)
-----


Ale jeżeli dało by radę zrobić coś takiego, że js uruchamiał by mi mój skrypt w php to wtedy można by było zastąpić tą pętle while instrukcją if else. Tylko jak zrobić żeby js uruchamiał mi mój skrypt z pliku set.php? Przecież javascript działa po stronie użytkownika a skrypt php wykonuje się po stronie serwera?
Go to the top of the page
+Quote Post
Dejmien_85
post
Post #7





Grupa: Zarejestrowani
Postów: 251
Pomógł: 23
Dołączył: 23.04.2013

Ostrzeżenie: (0%)
-----


Jedyne rozwiązanie to websockety, tj. nawiązanie stałego połączenia - wtedy przeglądarka utrzymuje stałe połączenie i na bieżąco może przekazywać różne dane od klienta (w tym wypadku od przeglądarki). Wtedy musiałbyś ustawić jakąś domyślną warrtość dla warunku w pętli, a nastepnie sprawdzać, czy nowa wartość (która nadpisze domyślną) nie została dosłana.

W tej chwili operujesz na błędnym założeniu, że PHP odpala tylko jeden proces, który działa. Wydaje się Tobie, że gdy raz go odpalisz wyślesz później drugi request, to że wrócisz do wcześniej dopalonego skryptu (proesu). Tak nie jest, przy każdym requeście odpalasz nowy proces, przy każdym Twoim requeście otwiera się nowy program (proces)

Ten post edytował Dejmien_85 6.12.2015, 12:44:57
Go to the top of the page
+Quote Post
Terrorizer
post
Post #8





Grupa: Zarejestrowani
Postów: 345
Pomógł: 3
Dołączył: 31.03.2012

Ostrzeżenie: (0%)
-----


Wszystko zależy od tego co ma robić ta pętla jeszcze....
Go to the top of the page
+Quote Post
mix091
post
Post #9





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 5.12.2015

Ostrzeżenie: (0%)
-----


Cytat(Terrorizer @ 6.12.2015, 12:49:55 ) *
Wszystko zależy od tego co ma robić ta pętla jeszcze....


Pętla jest bardzo banalna. Generalnie robię mały projekt do szkoły oparty na raspberry pi. Mój program ma wyświetlać na stronie www aktualną temperaturę w pomieszczeniu z czujnika i jeżeli wprowadzimy, że mamy dogrzać pomieszczenie np do 27*C to program ma wysłać 1 do przekaźnika, który uruchomi grzałkę i dogrzeje do tych 27*C i wyłączy. Jeżeli temperatura spadnie znowu poniżej tych 27*C(+-) to znowu ją włączy dogrzeje i się wyłączy i tak w kółko. Wygląda to aktualnie tak:
(IMG:http://i.imgur.com/5Vj8wtH.jpg)

Do tego właśnie była mi potrzebna ta pętla i chciałem to zrobić właśnie tak:
  1. if (isset($_POST['zatrzymaj']))
  2. {
  3. $stop = true;
  4. }
  5. if (isset($_POST['uruchom']))
  6. {
  7. $dtemp = $_POST['docelowaTemp']; // zapisanie do zmiennej $dtemp docelowej temperatury w pomieszczeniu
  8. while ($stop == false)
  9. {
  10. while ($temp < $docelowatemp) // zapętla dopóki temperatura z czujnika < od docelowej temp.
  11. {
  12. include 'temp.php'; // Pobranie temperatury z czujnika
  13. exec("gpio write 2 1"); // Włącza grzałkę
  14. }
  15. exec("gpio write 2 0"); // wyłącza grzałkę
  16. }
  17. }

Ktoś wyżej pisał, że można by zrobić skrypt w js, który by uruchamiał nasz skrypt php co np. sekunde. Jeżeli można by tak zrobić to wtedy tą pętle można by zastąpić instrukcją if else, czymś takim np.
  1. <?php
  2. include 'temp.php';
  3. if ($temp < $a)
  4. {
  5. exec("gpio write 2 1");
  6. }
  7. else
  8. {
  9. exec("gpio write 2 0");
  10. }
  11. ?>


I wtedy ten skrypt był by uruchamiany co sekunde przez js i on by robił za pętle. Tylko nie wiem w ogóle czy tak też można zrobić, czy nie bardzo. Macie jakiś pomysł jak takie coś wykonać?

Ten post edytował mix091 6.12.2015, 13:34:37
Go to the top of the page
+Quote Post
Terrorizer
post
Post #10





Grupa: Zarejestrowani
Postów: 345
Pomógł: 3
Dołączył: 31.03.2012

Ostrzeżenie: (0%)
-----


Łooo, ja w takim razie nie czuję się dosyć kompetentny, aby doradzać w takim temacie (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
SzpaaQ
post
Post #11





Grupa: Zarejestrowani
Postów: 19
Pomógł: 1
Dołączył: 22.11.2015

Ostrzeżenie: (0%)
-----


możesz to zrobić w samym js i jeśli temperatura jest za duża wyłączy grzałkę a jeśli za mała włączy (wyśle dane do pliku.php )
  1. <button onClick="czas = setInterval(temp, 1000)">Start</button>
  2. <p id="temperatura">Kliknij Start Zeby zacząć</p>
  3. <button onClick="clearInterval(czas)">Stop</button>
Go to the top of the page
+Quote Post
Daimos
post
Post #12





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Zrób sobie oddzielne akcje (mogą być oddzielne pliki php):
grzalka-wlacz.php
grzalka-temp.php

Całą pętlę, aplikację, robisz w javascript, pliki PHP służą tylko do tego, aby włączyć/wyłączyć/spr temp. grzałki.
Czy pętla to Twoja decyzja, ale w javascript wystarczy wtedy setInterval i np. co 30sek, sprawdzanie temperatury.
Jeśli jest potrzeba sprawdzenia temperatury, ajaxem pobierasz wartość grzalka-temp.php i jak trzeba ją włączyć to wywołujesz grzalka-wlacz.php

Ten post edytował Daimos 8.12.2015, 12:00:49
Go to the top of the page
+Quote Post
Pyton_000
post
Post #13





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Zapewne to jest banalne (ale nie sprawdzone)

W pętli sprawdzasz czy

  1. if(isset($_SESSION['kill'])) {
  2. unset($_SESSION['kill']);
  3. die();
  4. }


Robisz sobie w HTML przycisk z Ajax który wysyła sygnał do jakiegoś innego pliku który ustawi Ci zmienną sesyjną.
W pętli powinieneś mieć wtedy przerwanie.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 10.10.2025 - 19:50