requisitos:
PyQT4
instancia de la clase queue
#By: HackLoper #twiter: https://twitter.com/HackLoper #canal-youtube: hackdeveloper #facebook: hackloper from PyQt4 import QtCore import time,sys class Error(Exception): def __init__(self,error): self.error = error def __str__(self): return self.error class Queue: def __init__(self,max_data=1024,max_buffer=1024): self.__buffer = [] self.__writing = False self.__getting = False self.__max_data = max_data self.__max_buffer = max_buffer def __del_data_buffer(self): while self.len_buffer() > self.__max_buffer: del self.__buffer[0] def set_data(self,data): if self.__writing == True: return (False,'set_data','writing') elif sys.getsizeof(data) > self.__max_data: return (False,'set_data','size data not supported') else: if self.len_buffer() > self.__max_buffer: self.__del_data_buffer() self.__writing = True self.__buffer.append(data) self.__writing = False return (True,'set_data') def wait_data(self,num_loop=0,time_wait=1): if num_loop == 0 and time_wait > 0: return self.get_data(True) elif num_loop > 0 and time_wait > 0: num = 0 while num < num_loop: if self.len_buffer() > 0: return (True,'wait_data',self.get_data(True)) time.sleep(time_wait) return(False,'wait_data',[]) else: if num_loop < 0: raise Error('Error num_loop with signed') elif time_wait < 0: raise Error('Error time_wait with signed') def get_data(self,call=False): if self.__getting == True: return (False,'get_data','getting') self.__getting = True temp_buffer = self.__buffer self.__buffer = [] self.__getting = False if call == True: return temp_buffer return (True,'get_data',temp_buffer) def len_buffer(self): if len(self.__buffer) > 0: return sys.getsizeof(self.__buffer) else: return 0 class Thread(QtCore.QThread): __error_queue = [] def __init__(self,queues=[]): QtCore.QThread.__init__(self) for queue in queues: if queues[queue].__class__.__name__ == 'Queue': setattr(self,'_{0}'.format(queue),queues[queue]) else: self.__error_queue.append("Not supported object because it is not of type Queue, object {0} class {1}".format(queue,\ queues[queue].__class__.__name__)) if len(self.__error_queue) > 0: raise Error(str(self.__error_queue))Ejemplo de uso:
from threadComm import Thread,Queue import time class th(Thread): def __init__(self,**queues): Thread.__init__(self,queues) def run(self): for i in range(15): self._com.set_data(i+1) time.sleep(1) class th2(Thread): def __init__(self,**queues): Thread.__init__(self,queues) def run(self): n = 0 while n != 15: print "N vale: "+str(n) data = self._q.wait_data(3,1) if data[0] == True: n = data[2] q = Queue() t = th(com=q) t2 = th2(q=q) t.start() t2.start() for i in range(17): print "hilo princial: "+str(i) time.sleep(1)
Resultado:
hilo princial: 0
N vale: 0
N vale: [1]
hilo princial: 1
N vale: [2]
hilo princial: 2
N vale: [3]
hilo princial: 3
N vale: [4]
hilo princial: 4
N vale: [5]
hilo princial: 5
N vale: [6]
hilo princial: 6
N vale: [7]
hilo princial: 7
N vale: [8]
hilo princial: 8
N vale: [9]
hilo princial: 9
N vale: [10]
hilo princial: 10
N vale: [11]
hilo princial: 11
N vale: [12]
hilo princial: 12
N vale: [13]
hilo princial: 13
N vale: [14]
hilo princial: 14
N vale: [15]
hilo princial: 15
hilo princial: 16
CLASE QUEUE:
instancia de la clase queue
- max_data: Numero en bytes maximo por transferencia
- max_buffer: Numero en bytes maximo que puede contener el buffer,
en caso de superar el maximo de bytes en el buffer se eliminaran los
datos hasta quedar en el maximo de bytes especificado.
- data: Datos para transferir
- definicion: Retorna los datos de el buffer con un tiempo de espera
- num_loop: Numero de veces que se repite el bucle
- time_wait: Tiempo de espera por cada vuelta de el bucle
- definicion: Retorna los datos en el buffer
- Sin argumentos
- definicion: Retorna los datos en el buffer
- Sin argumentos
0 comentarios:
Publicar un comentario