Re: [python-romania] Cum pot rula o functie un anumit timp ?

66 views
Skip to first unread message

Catalin

unread,
Jan 30, 2013, 8:07:19 AM1/30/13
to python-...@googlegroups.com
Ai putea folosi threaduri de executie .

În data de 30 ianuarie 2013, 14:59, YO9HNF <yo9...@gmail.com> a scris:
Salut,

 Am un soft care trebuie sa-mi ruleze o anumita functie un anumit numar de secunde, la citirea unui buton.
 Stiu ca pot face acest lucru cu time.sleep(secunde) , dar acest lucru imi blocheza restul proceselor.

 Ce am eu este asemanator unui player audio :
-Apesi PLAY - ruleaza o functie un timp
-Daca apesi NEXT opreste functia de mai sus si trece la alta.

 Ma puteti ajuta ?

Multumesc !

Radu

--
Aţi primit acest mesaj deoarece sunteţi abonat(ă) la grupul "Python Romania" din Grupuri Google.

Pentru a vă dezabona de la grup şi pentru a nu mai primi e-mailuri de la acesta, trimiteţi un e-mail la adresa python-romani...@googlegroups.com.
Pentru mai multe opţiuni, accesaţi https://groups.google.com/groups/opt_out.





--
python-catalin.blogspot.com
www.free-tutorials.org

daniels

unread,
Jan 30, 2013, 8:08:38 AM1/30/13
to python-...@googlegroups.com
Poti folosi threaduri.

Peter Damoc

unread,
Jan 30, 2013, 8:14:12 AM1/30/13
to python-...@googlegroups.com
Buna,

time.sleep(secunde) face exact ce spune... pune executia pe pauza.

primul pas ar fi sa traduci ce inseamna sa ruleze o functie un anumit numar de secunde pentru ca lucrul acesta este abstract.
Imi imaginez ca va fi nevoie sa-ti iei un reper de timp (T0) si sa executi ceva dupa care sa verifici cum stai cu timpul, ceva gen "am trecut de T0+secunde?"

Pentru ca o astfel de functie ar fi prin natura ei blocking, este recomandat sa folosesti un alt fir de executie si sa comunici cu firul principal prin intermediul evenimentelor.
pentru wxPython ai aici un exemplu:
http://wiki.wxpython.org/LongRunningTasks
dar principiul ar trebui sa poata fi portat usos la un alt GUI toolkit.

Bafta,
Petre




2013/1/30 YO9HNF <yo9...@gmail.com>

Salut,

 Am un soft care trebuie sa-mi ruleze o anumita functie un anumit numar de secunde, la citirea unui buton.
 Stiu ca pot face acest lucru cu time.sleep(secunde) , dar acest lucru imi blocheza restul proceselor.

 Ce am eu este asemanator unui player audio :
-Apesi PLAY - ruleaza o functie un timp
-Daca apesi NEXT opreste functia de mai sus si trece la alta.

 Ma puteti ajuta ?

Multumesc !

Radu

--
Aţi primit acest mesaj deoarece sunteţi abonat(ă) la grupul "Python Romania" din Grupuri Google.

Pentru a vă dezabona de la grup şi pentru a nu mai primi e-mailuri de la acesta, trimiteţi un e-mail la adresa python-romani...@googlegroups.com.
Pentru mai multe opţiuni, accesaţi https://groups.google.com/groups/opt_out.





--
There is NO FATE, we are the creators.
blog: http://damoc.ro/

cmiN

unread,
Jan 30, 2013, 8:24:49 AM1/30/13
to python-...@googlegroups.com
Daca spui ca sleep iti blocheaza "restul proceselor" atunci orice alta metoda de a tine in viata sau de a reapela functia respectiva, dupa terminarea ei, pentru un anumit timp iti va bloca de asemenea interfata sau ceea ce ar trebui sa-ti raspunda. Ideea este sa pornesti un nou thread care se ocupa de rularea functiei respective si sa o tot apeleze pana considera el ca au trecut cele N secunde sau alte unitati de timp.
Pentru asta vezi in timeit: Timer si timer.timeit/repeat si sa nu uiti sa pui in acea functie la sfarsit un sleep (asta daca nu cumva vrei sa-ti reporneasca apelul imediat dupa returnul anterior si vrei sa ai un delay). Acum depinde atat de functia apelata cat si de cea apelanta, daca ne dai mai multe detalii, poate reuseste cineva sa-ti spuna o implementare mai eleganta decat ideea mea.

Catalin

unread,
Jan 30, 2013, 12:39:17 PM1/30/13
to python-...@googlegroups.com
Stii ce nu inteleg eu :
- de ce spui de raspberry PI pentru ca noi vb de python nu de platfforma hardware ;
- de ce ai nevoie de 10 secunde ?
- trecerea intre stringuri se poate face in functie de o exceptie ;
- poti face dupa cum au spus toti cu threaduri.
Daca ai nevoie de ajutor si crezi ca poti face share la codul sursa atunci ne va fi mai usor tuturor sa te ajutam.
Cu datele pe jumatate ne bagi in ceata .
O seara cat mai buna .

Peter Damoc

unread,
Jan 30, 2013, 1:31:02 PM1/30/13
to python-...@googlegroups.com
aaaa... pai se simplifica foarte foarte mult problema.
Nu mai e chiar blocking ci pur si simplu trimitere de mesaje.

n-am rulat codul decat in cap la mine pentru ca nu am un raspberryPI, dar ar trebui sa fie relativ ok.

modul in care este setat este
cu startTime=time.time() pentru un sir nou la fiecare 10 sec.

desigur.... nu are nici un fel de protectie la terminarea string-urilor, etc.



2013/1/30 YO9HNF <yo9...@gmail.com>
Va multumesc  tuturor pentru raspunsuri !

Cand ajung acasa o sa incerc solutiile postate de voi.

Incerc sa explic mai concret problema :

- folosesc un raspberry PI care comanda pe UBS un generator de functii (se trimite un string cu mai multe informatii in el, pe serial)
- pe porturile GPIO am conectat un LCD si niste butoane (printre care START, STOP etc)
- Ar trebui sa faca asa:
---cand apas pe START sa-mi trimita primul string pe USB (sunt mai multe stringuri) -> stringul se duce la generator iar el genereaza acelasi lucru pana la o noua comanda. Ideea este ca mie imi trebuie de exemplu sa ruleze 10 secunde, dupa care sa treaca la stringul2 etc.
---daca nu se apasa nimic, dupa X secunde sa se treaca la urmatorul string
---daca se apasa NEXT sa imi genereze alt string etc...

Cam asta ar fi...

--
Aţi primit acest mesaj deoarece sunteţi abonat(ă) la grupul „Python Romania” din Grupuri Google.
 
Pentru a vă dezabona de la grup şi pentru a nu mai primi e-mailuri de la acesta, trimiteţi un e-mail la adresa python-romani...@googlegroups.com.
Pentru mai multe opţiuni, accesaţi https://groups.google.com/groups/opt_out.
 
 

Peter Damoc

unread,
Jan 30, 2013, 1:37:05 PM1/30/13
to python-...@googlegroups.com
scuze pentru incoerenta de mai devreme vroiam sa spun ca

modul in care este setat este sa trimita un sir nou dupa ce trec cele 10 sec.
daca se inlocuieste startTime= 0 de dupa if cu startTime=time.time() va fi un sir nou la fiecare 10 sec.


2013/1/30 Peter Damoc <pda...@gmail.com>
Reply all
Reply to author
Forward
0 new messages