Форум сайта python.su
Форумчане, есть железка на порту, ее постоянно опрашиваю, в цикле, получив данные(которые могут поступить еще раз или два), складываем результат и таймер по команде начинает отсчет, но от железки могут прийти еще данные, которые надо прибавить к уже начавшему отсчет таймеру…
import time import sys def tim(x): for i in range(x): sys.stdout.write('%s \r' % (i)) sys.stdout.flush() time.sleep(2) while True: esc = dat.data() if esc is not False: print summ if dat.stack(): summ += esc['summ']
Офлайн
Делал проверку новой записи в файл от устройства, если во время отсчета пришли новые данные, но if можно продолжать до бесконечности, не правильно.
Пока думаю как отправлять в таймер новые данные и как их обрабатывать.
import time, sys from threading import Thread def log(out_log): with open("test.txt", "ab+") as f: f.write(str(out_log)+'\n') def Temp(z): with open("tempLog.txt", "w") as f: f.write(str(z)) def tim():# таймер while True: #raw_input(';')# ожидает ввод, пустое значение with open("tempLog.txt", "r") as f:# считывает число t = f.read()#.split('.') t = str(t) print (t) if t.isdigit(): t = int(t) for i in range(t):# t -= 1 print('%s \r' % (t)) sys.stdout.write('%s \r' % (t)) sys.stdout.flush() time.sleep(0.2) if t== 1: Temp(1) break else: pass from random import randint def kup():# данные с устройства int while True: q = randint(0, 201) #for i in range(201): time.sleep(0.2) print(" > ", q) if q == 50 or q == 100: Temp(q)# запись значения в тхт t1 = Thread(target=kup) t2 = Thread(target=tim) t1.start() t2.start() t1.join() t2.join()
Отредактировано Kasta_neda (Сен. 23, 2017 13:25:55)
Офлайн
import time, sys from Queue import Queue from threading import Thread q = Queue() def log(out_log): with open("test.txt", "ab+") as f: f.write(str(out_log)+'\n') def Temp(z): with open("tempLog.txt", "w") as f: f.write(str(z)) def tim():# таймер while True: raw_input(';')# ожидает ввод, пустое значение t = q.get() for i in range(t):# if q.empty(): pass else: t = (q.get()-i) q.put(t) tim() t -= 1 print('%s \r' % (t)) sys.stdout.write('%s \r' % (t)) sys.stdout.flush() time.sleep(0.5) if t == 1: #Temp(0) break #tim() from random import randint def kup():# данные с устройства int while True: out = randint(0, 201) time.sleep(0.5) print(" > ", out) if out == 50 or out == 100: print(" >>>>>>>>>>>> ", out) q.put(out) #Temp(out)# запись значения в тхт t1 = Thread(target=kup) t2 = Thread(target=tim) t1.start() t2.start() t1.join() t2.join()
Отредактировано Kasta_neda (Сен. 23, 2017 14:36:43)
Офлайн
тут скорее событийная схема (event loop) нужна а не треды
import gevent from random import randint class W: count = 0 flag = True def event(): while True: if not w.flag: break t = randint(3,10) print('event',t) w.count += t gevent.sleep(5) def out(): while w.count: w.count -= 1 print('out',w.count) gevent.sleep(1) w.flag = False w = W() gevent.joinall([ gevent.spawn(event), gevent.spawn(out), ]) print('End')
Отредактировано vic57 (Сен. 23, 2017 17:10:39)
Офлайн
vic57Получается, если в функции event, не поставить gevent.sleep(5) на число равное t, код не работает должным образом(условно должным), но пока работает sleep, работает out. но не работает event. Если ставить gevent.sleep(t+2) программа завершается по истечении отсчета.
тут скорее событийная схема (event loop) нужна а не треды
Офлайн
в данном случае event() имитирует добавление денег во время работы счетчика
можно проще
from time import sleep class W(): def __init__(self): self.data = [5,0,0,0,2,] self.it = iter(self.data) def get(self): try: return next(self.it) except: return 0 def out( num = 1): print('Start') count = num while count: sleep(1) count -= 1 delta = w.get()# add cash count += delta print('out',delta,count) print('Stop') w = W() out(1)
Офлайн
# -*- coding: utf-8 -*- import sys from time import sleep from Queue import Queue from threading import Thread, enumerate import time from ccnet import CCNET q = Queue() def print_logo(): print(chr(27) + "[2J") # ClearScreen print (""" # ___ _ ___ _ # / __| __ _ ___ | |_ / __| ___ __| | ___ # | (__ / _` | (_-< | ' \ | (__ / _ \ / _` | / -_) # \___| \__,_| /__/ |_||_| \___| \___/ \__,_| \___| # python-ccnet lib demo \t by CookIT """) def print_balance(balance, amount=False): sys.stdout.write("\b\r Balance: " + str(balance)) if amount: sys.stdout.write(" | Hmmm, Its " + str(amount) + ". Om nom nom nom...") else: sys.stdout.write(" ") sys.stdout.flush() def print_device(device): print ("\n==== Device ====") print( "PART" + str(device['Part']) + "\t" "SERIAL" + str(device['Serial']) + "\t" "ASSET(H)" + str(device['Asset']).encode('hex') + "\t" ) sys.stdout.flush() def print_bill_table(table): print ("\n== BILL TABLE ==") for i, bill in enumerate(table): if i % 4 != 0: sys.stdout.write("\t\t") sys.stdout.write(str(int(bill['amount'])) + str(bill['code'])) else: sys.stdout.write("\n") sys.stdout.write(str(int(bill['amount'])) + str(bill['code'])) ccnet = CCNET('/dev/ttyUSB0', '03') # Init: connect to serial if ccnet.connect() and ccnet.start(): # reset end enable bill types print_logo() print_device(ccnet.device) #print_bill_table(ccnet.billTable) else: print ("Connection error. Check log files") def log(out_log): with open("test.txt", "ab+") as f: f.write(str(out_log)+'\n') def Temp(z): with open("tempLog.txt", "w") as f: f.write(str(z)) def put(): balance = 0 print ("\n==== ESCROW ==== [Give me some money] \n") #while True: esc = ccnet.escrow() # Allows get cash. return {'amount', 'code'} if esc is not False: print_balance(balance, esc['amount']) #log('+'+str(int(esc['amount']))+' >>> '+ str(timer.data())) if ccnet.stack(): # Get this bill balance += esc['amount'] print_balance(balance) Temp(balance) log("sum "+ str(int(balance))) q.put(balance) def worker(): while True: if q.empty(): sys.exit() er= q.get() print u'Очередь: %s выполняется' % er for i in range(int(er)): if q.empty(): pass else: er += q.get() put() er -= 1 print('%s \r' % (er)) sys.stdout.write('%s \r' % (er)) sys.stdout.flush() time.sleep(0.3) q.task_done() print u'Очередь: %s завершилась' % er put() while True: print u'Поток', u'стартовал' put() Thread(target=worker).start() sleep(2) print 'Over'
Офлайн
vic57Спасибо, что помогаете. Пока не адаптировал под Ваш пример.
в данном случае event() имитирует добавление денег во время работы счетчика можно проще
Офлайн
Kasta_nedaможно сделать QCoreApplication без гуя, там и таймер есть и события, только я работал с разными железками и всегда все делал простым циклом, не пойму зачем вам треды
PyQt4 заинтересовал, но примеры в основном гуевые, консольных мало, разбираюсь, если есть идеи у кого, буду рад помощи.
from time import sleep class W(): def __init__(self): self.data = [0,0,0,5,0,0,2,] self.it = iter(self.data) def get(self): try: return next(self.it) except: return 0 def out( num = 1): print('Start') count = num while count: sleep(1) count -= 1 cash = w.get()# add cash count += cash print('out',cash,count) print('Stop') w = W() while True: #mainloop cash = w.get() if cash: out(cash) else: print('Wait') sleep(1)
Отредактировано vic57 (Сен. 24, 2017 11:44:44)
Офлайн
vic57
class W(): def __init__(self): self.balanceOut = 0 self.balance = [] print ("\n==== ESCROW ==== [Give me some money] \n") self.esc = ccnet.escrow() # Allows get cash. return {'amount', 'code'} if self.esc is not False: print_balance(self.balance, self.esc['amount']) if ccnet.stack(): self.balanceOut += self.esc['amount']# Get this bill print_balance(self.balance) self.balance.append(self.esc['amount']) self.data = self.balance self.it = iter(self.data) def get(self): try: return next(self.it) except: return 0
Офлайн