Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 22, 2017 20:45:02

Kasta_neda
Зарегистрирован: 2014-06-08
Сообщения: 210
Репутация: +  6  -
Профиль   Отправить e-mail  

Таймер обратного отсчета с обновлением и суммированием данных

Форумчане, есть железка на порту, ее постоянно опрашиваю, в цикле, получив данные(которые могут поступить еще раз или два), складываем результат и таймер по команде начинает отсчет, но от железки могут прийти еще данные, которые надо прибавить к уже начавшему отсчет таймеру…

 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']
Пробовал создать две функции, одну таймер и одну опрашивающую порт, создал два потока, но один поток в цикле, то не давал второму запустится то неверно логика отрабатывала….или голова(

Офлайн

#2 Сен. 23, 2017 13:08:36

Kasta_neda
Зарегистрирован: 2014-06-08
Сообщения: 210
Репутация: +  6  -
Профиль   Отправить e-mail  

Таймер обратного отсчета с обновлением и суммированием данных

Делал проверку новой записи в файл от устройства, если во время отсчета пришли новые данные, но 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)

Офлайн

#3 Сен. 23, 2017 13:51:20

Kasta_neda
Зарегистрирован: 2014-06-08
Сообщения: 210
Репутация: +  6  -
Профиль   Отправить e-mail  

Таймер обратного отсчета с обновлением и суммированием данных

 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()
С таймером пока плохо
И почему то под linux логика совсем не работает, запускается только первый процесс, пока второй не воткнешь в функцию первого.

Отредактировано Kasta_neda (Сен. 23, 2017 14:36:43)

Офлайн

#4 Сен. 23, 2017 15:50:54

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Таймер обратного отсчета с обновлением и суммированием данных

тут скорее событийная схема (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)

Офлайн

#5 Сен. 24, 2017 00:31:28

Kasta_neda
Зарегистрирован: 2014-06-08
Сообщения: 210
Репутация: +  6  -
Профиль   Отправить e-mail  

Таймер обратного отсчета с обновлением и суммированием данных

vic57
тут скорее событийная схема (event loop) нужна а не треды
Получается, если в функции event, не поставить gevent.sleep(5) на число равное t, код не работает должным образом(условно должным), но пока работает sleep, работает out. но не работает event. Если ставить gevent.sleep(t+2) программа завершается по истечении отсчета.

Офлайн

#6 Сен. 24, 2017 01:00:03

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Таймер обратного отсчета с обновлением и суммированием данных

в данном случае 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)

Офлайн

#7 Сен. 24, 2017 11:24:32

Kasta_neda
Зарегистрирован: 2014-06-08
Сообщения: 210
Репутация: +  6  -
Профиль   Отправить e-mail  

Таймер обратного отсчета с обновлением и суммированием данных

 # -*- 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'
Пока добился более менее рабочего состояния, купюрник должен всегда в цикле опрашиваться, поэтому это должен быть отдельный процесс, из которого данные забирает таймер и если надо суммирует.
PyQt4 заинтересовал, но примеры в основном гуевые, консольных мало, разбираюсь, если есть идеи у кого, буду рад помощи.

Офлайн

#8 Сен. 24, 2017 11:30:34

Kasta_neda
Зарегистрирован: 2014-06-08
Сообщения: 210
Репутация: +  6  -
Профиль   Отправить e-mail  

Таймер обратного отсчета с обновлением и суммированием данных

vic57
в данном случае event() имитирует добавление денег во время работы счетчика можно проще
Спасибо, что помогаете. Пока не адаптировал под Ваш пример.

Офлайн

#9 Сен. 24, 2017 11:42:09

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Таймер обратного отсчета с обновлением и суммированием данных

Kasta_neda
PyQt4 заинтересовал, но примеры в основном гуевые, консольных мало, разбираюсь, если есть идеи у кого, буду рад помощи.
можно сделать QCoreApplication без гуя, там и таймер есть и события, только я работал с разными железками и всегда все делал простым циклом, не пойму зачем вам треды
 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)

Офлайн

#10 Сен. 24, 2017 12:18:27

Kasta_neda
Зарегистрирован: 2014-06-08
Сообщения: 210
Репутация: +  6  -
Профиль   Отправить e-mail  

Таймер обратного отсчета с обновлением и суммированием данных

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
Пока работает таймер, неактивен купюрник… esc = ccnet.escrow() ожидает ввода купюры, после того как купюра валидирована, срабатывает таймер, а купюрник неактивен становится

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version