Пример #1
0
def main():
    logConfig()
    handle = open("./resultChen.csv", "w")
    f = open("./top5k.csv")

    threads = []
    while 1:
        line = f.readline().strip()
        if not line:
            break
        lineList = line.split(",")  #line:  "1,google.com"
        if len(threads) < 10:
            mt = MyThread(process, (lineList, handle))
            mt.start()
            time.sleep(1)
            threads.append(mt)

        for thread in threads:
            if thread.isAlive():
                continue
            else:
                threads.remove(thread)

    for thread in threads:
        thread.join()
    f.close()
    handle.close()
Пример #2
0
class MyPixmap(QtGui.QGraphicsPixmapItem):
    def __init__(self, parent):
        QtGui.QGraphicsPixmapItem.__init__(self)
        self.parent = parent
        self.currentSide = 0
        
        self.thread = MyThread(self.parent, self.parent.getRandom)
        self.thread.finished.connect(self.parent.errorHandler)

        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.swapCoin)
        
    def mousePressEvent(self, e):
        if self.thread.isRunning() and self.timer.isActive():
            e.ignore()
        else:
            self.parent.hint.hide() 
            self.count = 0 # counter for coin's swaping
            self.timer.start(50)     
            self.thread.start()
            e.accept()

    def swapCoin(self):
        if self.count < 50 or self.thread.isRunning():
            self.currentSide = int(not self.currentSide) # 1 turns to 0, 0 to 1
            self.setPixmap (self.parent.comboBox.itemData(self.parent.comboBox.currentIndex())[ self.currentSide ])
            self.count += 1
        else:
            self.timer.stop()
            if not self.parent.error and self.parent.result:
                self.setPixmap (self.parent.comboBox.itemData(self.parent.comboBox.currentIndex())[ int(self.parent.result[0]) ]) # SHOW RESULT!
                
            self.parent.log(error=self.parent.error) # log into journal
Пример #3
0
    def Listen(self):
        print("server:开始监听")
        self.__server_socket.listen(128)
        self.__server_is_listening = True

        while self.__server_is_listening:
            try:
                client_socket, client_addr = self.__server_socket.accept(
                )  # 设置setblocking(False)后, accept不再阻塞
                print("连接成功,客户端ip:{},port:{}".format(client_addr[0],
                                                     client_addr[1]))

                # 一旦连接成功,开一个子线程进行通信
                client_socket.setblocking(False)  # 子线程是非阻塞模式的(需要循环判断监听线程退出)
                client_socket.settimeout(5)  # 超时值设为5s
                self.__running_client_cnt += 1
                self.__thread_cnt += 1
                self.new_client_signal.emit(
                    self.__running_client_cnt)  # 向ui发信号,更新ui
                client_name = "client{}".format(self.__thread_cnt)  # 创建子线程
                client_thread = MyThread(client_name, self.SubClientThread,
                                         [client_socket, client_name])
                client_thread.setDaemon(True)  # 子线程配置为守护线程,主线程结束时强制结束
                client_thread.start()  # 子线程启动

            except BlockingIOError:
                pass
Пример #4
0
def main():
	argv = sys.argv[1:]
	numS = [ int(argv[0][i:i+2], 16) for i in range(0,len(argv[0]),2) ]
	numD = [ int(argv[1][i:i+2], 16) for i in range(0,len(argv[1]),2) ]
	
	src = ''
	dst = ''
	for i in numS:
		src += struct.pack('!B', i)
	for i in numD:
		dst += struct.pack('!B', i)
	back = MyThread(thread_func, [])
	back.start()
	#back.join()
	back2 = MyThread(thread_func2, [])
	back2.start()
	cheat2 = eapauth.EAPAuth(['1','1','eth1'])
	cheat2.set_fake(src, dst)
	cheat2.send_failure()

	while True:
		try:
			print "ok"
			packet = cheat2.client.recv(1600)
			print "ok2"
			print repr(packet)
			#cheat2.send_request_pass()
			#packet = cheat2.client.recv(1600)
			#print repr(packet)
		except:
			print "error"
			pass
Пример #5
0
class Controller:

    def __init__(self):
        self.clock_block = threading.Event()

        self.person_detection_block = threading.Event()
        self.face_detection_block = threading.Event()
        self.pose_detection_block = threading.Event()
        self.emotion_detection_block = threading.Event()
        self.face_direction_block = threading.Event()
        self.face_recognition_block = threading.Event()

        self.students = []
        self.faces = []
        self.poses = []
        self.names = []
        self.emo = []
        self.face_dir = []

        self.faceDetector = DetectFace()
        self.recognitionFace = RecognitionFace()

    def process_frame(self, frame):
        # clear all events
        self.person_detection_block.clear()
        self.face_detection_block.clear()
        self.pose_detection_block.clear()
        self.emotion_detection_block.clear()
        self.face_direction_block.clear()
        self.face_recognition_block.clear()

        # frame = cv2.imread(framePath, cv2.IMREAD_COLOR)

        # init all threads
        self.faceDetectorThread = MyThread(
            name="faceDetectorThread",
            processor=self.faceDetector,
            other_events=[self.face_detection_block],
            args=frame)
        self.faceRecogThread = MyThread(
            name="faceRecognitionThread",
            other_events=[self.face_recognition_block],
            processor=self.recognitionFace,
            args=self.faces)

        # start all threads
        self.faceDetectorThread.start()
        self.faceRecogThread.start()

        # waiting all events
        self.face_detection_block.wait()
        self.face_recognition_block.wait()

        # take res from threads
        self.faces = self.faceDetectorThread.mydata
        self.names = self.faceRecogThread.mydata

        # return last res
        return self.names
Пример #6
0
def queue_standby_Th(q, judArr, masterArr):

    thQueue = MyThread(savedQueue, (q, judArr))
    thStandby = MyThread(standby, masterArr)
    
    thQueue.start()
    thStandby.start()
    
    thQueue.join()
    thStandby.join()
Пример #7
0
class MyWidget(QtGui.QWidget, Ui_MyWidget, ResultTable):
    def __init__(self, parent=None, master=None):
        QtGui.QWidget.__init__(self, parent)
        self.master = master
        self.error = self.result = self.model = None
        
        self.column = 1
        
        self.setupUi(self)          # set UI (method from Ui_MyWidget)
        ResultTable.__init__(self)  # set UI for result group widget (result table etc...)
        
        self.btnGenerate.clicked.connect(self.generate)
        self.spinCol.valueChanged["int"].connect(self.changeColumn)
        self.btnClear.clicked.connect(self.clearTable)
        self.btnCopy.clicked.connect(self.copyResult)
        self.btnSave.clicked.connect(self.saveResult)
        
        self.thread = MyThread(self, self.getRandom)
        self.thread.finished.connect(self.errorHandler)

    def generate(self):
        self.btnGenerate.setDisabled(True)
        self.thread.start()
        
    def getRandom(self):
        fract = self.spinFract.value()
        num = self.spinNum.value()
        min = self.spinMin.value()
        max = self.spinMax.value()

        # list with only integers  (0, 2, 5, 17...)
        intResult = [min]*num if (min == max-1) else self.master.random.integers(num=num, min=min, max=max-1, base='10', col=1, format='plain', rnd='new')
        
        # list with only decimals (100, 225, 50, 4...)
        fractResult = self.master.random.integers(num=num, min=0, max=(10**fract)-1, base='10', col=1, format='plain', rnd='new')

        # merge 2 lists together (0.100, 2.225, 5.050, 17.004...)
        result = ["{0:.{1}f}".format(int(intResult[i]) + (int(fractResult[i]) / 10**fract), fract) for i in range(num)] # 1 and 23 -> 1.00023 if fract is 5
                
        if self.checkAdd.isChecked() and type(self.result) is list:
            self.result.extend(result)
        else:
            self.result = result

        self.makeTable()

    def log(self, error=None):
        from time import strftime
        self.master.logs.addRow(strftime("%d-%m-%Y"),
                                strftime("%H:%M:%S"),
                                self.master.random.__class__.__name__,
                                "Floats Generator",
                                error if error else "Generated: num=%s min=%s max=%s ndigits=%s" % (self.spinNum.value(), self.spinMin.value(), self.spinMax.value(), self.spinFract.value()))
Пример #8
0
class MyWidget(QtGui.QWidget, Ui_MyWidget, ResultTable):
    def __init__(self, parent=None, master=None):
        QtGui.QWidget.__init__(self, parent)
        self.master = master
        self.error = self.result = self.model = None
        
        self.column = 1
        
        self.setupUi(self)          # set UI (method from Ui_MyWidget)
        ResultTable.__init__(self)  # set UI for result group widget (result table etc...)
        
        self.btnGenerate.clicked.connect(self.generate)

        self.spinCol.valueChanged["int"].connect(self.changeColumn)
        self.btnClear.clicked.connect(self.clearTable)
        self.btnCopy.clicked.connect(self.copyResult)
        self.btnSave.clicked.connect(self.saveResult)
        
        self.thread = MyThread(self, self.getRandom)
        self.thread.finished.connect(self.errorHandler)

    def generate(self):
        self.btnGenerate.setDisabled(True)
        self.thread.start()
        
    def getRandom(self):
        result = self.master.random.strings(num         = self.spinNum.value(),
                                            len         = self.spinLen.value(),
                                            loweralpha  = "on" if self.checkLower.isChecked() else "off",
                                            digits      = "on" if self.checkDigits.isChecked() else "off",
                                            upperalpha  = "on" if self.checkUpper.isChecked() else "off",
                                            unique      = "on" if self.checkUnique.isChecked() else "off",
                                            format='plain', rnd='new')
        if self.checkAdd.isChecked() and type(self.result) is list:
            self.result.extend(result)
        else:
            self.result = result
        # print(self.result)
        self.makeTable()

    def log(self, error=None):
        from time import strftime
        self.master.logs.addRow(strftime("%d-%m-%Y"),
                                strftime("%H:%M:%S"),
                                self.master.random.__class__.__name__,
                                "Strings Generator",
                                error if error else "Generated: num=%s len=%s" % (self.spinNum.value(),
                                                                                  self.spinLen.value()))
Пример #9
0
def main():
    nfuncs = range(len(funcs))

    print '*** SINGLE THREAD'
    for i in nfuncs:
        print 'starting', funcs[i].__name__, 'at:', ctime()
        print funcs[i](n)
        print funcs[i].__name__, 'finished at:', ctime()
    print '*** MULTIPLE THREAD'
    threads = []
    for i in nfuncs:
        t = MyThread(funcs[i], (n, ), funcs[i].__name__)
        threads.append(t)
    for t in threads:
        t.start()
        sleep(0.01)
    for t in threads:
        t.join()
        print t.getResult()
    print 'all done'
Пример #10
0
class Controller:

    def __init__(self):
        self.person_detection_block = threading.Event()
        self.face_detection_block = threading.Event()
        self.pose_detection_block = threading.Event()
        self.emotion_detection_block = threading.Event()
        self.face_direction_block = threading.Event()
        self.face_recognition_block = threading.Event()

        self.students = []
        self.faces = []
        self.poses = []
        self.names = []
        self.emo = []
        self.face_dir = []

        self.faceDetector = DetectFace()
        self.recognitionFace = RecognitionFace()

    def process_frame(self, frame):
        # frame = cv2.imread(framePath, cv2.IMREAD_COLOR)
        self.faceDetectorThread = MyThread(
            name="faceDetectorThread",
            processor=self.faceDetector,
            event=None,
            other_events=[self.face_recognition_block],
            args=frame)
        self.faceRecogThread = MyThread(
            name="faceRecognitionThread",
            processor=self.recognitionFace,
            event=self.face_recognition_block,
            other_events=[self.emotion_detection_block],
            args=self.faceDetectorThread.mydata)

        self.faceDetectorThread.start()
        self.faceRecogThread.start()
        self.emotion_detection_block.wait()
        return self.faceRecogThread.mydata
Пример #11
0
    def Confirm(self):
        if self.portNum.text() == '':
            self.statusbar.showMessage("配置错误,port禁止为空")
            return
        if not IsIPV4(self.IPNum.text()):
            self.statusbar.showMessage("配置错误,非法的ip地址")
            return

        port = int(self.portNum.text())
        ip = self.IPNum.text()

        if self.__TransPorter.IsServer():
            self.__port = port
            self.__TransPorter.GetMainUI().uploadButton.setEnabled(False)
            self.__TransPorter.GetMainUI().downloadButton.setEnabled(False)
            server = self.__TransPorter.GetServer()
            server.ServerStart(port)  # 启动服务器(开始监听)
            self.statusbar.showMessage("正在监听port:{},client连接:0".format(port))
            self.__TransPorter.GetMainUI().statusbar.showMessage(
                "正在监听port:{},client连接:0".format(port))
        else:
            self.__TransPorter.GetMainUI().uploadButton.setEnabled(True)
            self.__TransPorter.GetMainUI().downloadButton.setEnabled(True)
            client = self.__TransPorter.GetClient()
            client.SetDestServer(port, ip)  # 设置目标port和ip
            client.ClientStart()  # 启动客户端
            self.statusbar.showMessage("connecting server")
            self.__TransPorter.GetMainUI().statusbar.showMessage(
                "connecting server")

            # 用一个子线程连接服务器,若连接成功,就创建心跳线程,然后结束
            connection_thread = MyThread(
                'connecting',
                self.__TransPorter.GetClient().Connect2Server)
            connection_thread.setDaemon(True)  # 子线程配置为守护线程,主线程结束时强制结束
            connection_thread.start()

        self.__TransPorter.SetWroking(True)  # 设置工作标志
        self.ShowWindow()  # 刷新窗口UI
Пример #12
0
    def AddConnection(self,proc,name,pabr=None):       
        # 创建一个socket连接
        new_socket = self.CreatSocket()
        if new_socket == None:
            return
        new_socket.setblocking(False)                    # 子线程是非阻塞模式的(需要循环判断监听线程退出)
        new_socket.settimeout(5)                         # 超时值设为5s                    

        # 创建一个连接子线程
        if pabr == None:    # 不关联下载进度页面,这是心跳线程
            connection_thread = MyThread(name,proc,[new_socket,name])
        else:               # 下载线程,关联下载进度页面
            connection_thread = MyThread(name,proc,[new_socket,name,pabr])

        # 子线程统一加入__sub_thread管理
        if not name in self.__sub_thread:
            self.__sub_thread[name] = [Frame(),connection_thread,new_socket]
        
        # 注册socket
        self.DataSend(new_socket,name,self.__ID.encode('utf-8')) 

        # 启动连接子线程
        connection_thread.setDaemon(True)   # 子线程配置为守护线程,主线程结束时强制结束
        connection_thread.start()           
Пример #13
0
 def run(*args, **kwargs):
     try:
         t = MyThread(function, args=args, kwargs=kwargs)
         t.start()
     except:
         raise
Пример #14
0
class MyWidget(QtGui.QWidget, Ui_MyWidget, ResultTable):
    def __init__(self, parent=None, master=None):
        QtGui.QWidget.__init__(self, parent)
        self.master = master
        self.error = self.result = self.model = None
        
        self.column = 1
        
        self.setupUi(self)          # set UI (method from Ui_MyWidget)
        ResultTable.__init__(self)  # set UI for result group widget (result table etc...)
        self.tableResult.setSortingEnabled(False) # disable column sorting (keep the items mixed is the point)
        
        self.listModel = MyModel(1, 1, self.lblInfo)
        self.tableCustomList.setModel(self.listModel)
        self.tableCustomList.setEditTriggers(QtGui.QAbstractItemView.AllEditTriggers)
        self.tableCustomList.horizontalHeader().hide()
        self.tableCustomList.setColumnWidth(0, 150)

        self.fillPresetsList()
        
        # one groupPanel disables the other
        self.groupGenerate.toggled.connect(lambda checked: self.groupLoad.setChecked(not checked))
        self.groupLoad.toggled.connect(lambda checked: self.groupGenerate.setChecked(not checked))
        
        self.btnGenerate.clicked.connect(self.generate)
        self.comboPresets.activated["int"].connect(self.setPreset)
        self.btnLoad.clicked.connect(self.loadList)
        self.btnListClear.clicked.connect(lambda: self.listModel.clear())
        self.spinCol.valueChanged["int"].connect(self.changeColumn)
        self.btnClear.clicked.connect(self.clearTable)
        self.btnCopy.clicked.connect(self.copyResult)
        self.btnSave.clicked.connect(self.saveResult)
        
        self.thread = MyThread(self, self.getRandom)
        self.thread.finished.connect(self.errorHandler)

    def fillPresetsList(self):
        for preset in sorted(PRESETS["Sequences"]):
            self.comboPresets.addItem(preset[1:], PRESETS["Sequences"][preset])

    def loadList(self):
        file = QtGui.QFileDialog.getOpenFileName( 
                parent=self, caption="Load data from file", directory=QtCore.QDir.currentPath(),
                filter="CSV and text files (*.csv *.txt)")
        if file:
            sep = QtGui.QInputDialog.getText(self, "Type separator", "Type symbol that will be use for split text data", text=",")
            if not all(sep): return
            data = open(file, 'r').read()
            res=[]
            for l in data.split('\n'):
                res.extend(l.split(sep[0]))

            res = list( filter(lambda x: x.lstrip(), res) )
            
            self.listModel.clear()
            for row in range(len(res)):
                item = QtGui.QStandardItem(res[row])
                self.listModel.setItem(row, 0, item)
            self.tableCustomList.setColumnWidth(0, 150)

            self.log(file=file)

    def setPreset(self, index):
        self.listModel.clear()
        if index == 0: return
        # list stored in comboBox itemData
        l = self.comboPresets.itemData(index)
        for i in range(len(l)):
            item = QtGui.QStandardItem(l[i])
            self.listModel.setItem(i, 0, item)
        self.tableCustomList.setColumnWidth(0, 150)

    def generate(self):
        self.btnGenerate.setDisabled(True)
        self.thread.start()
        
    def getRandom(self):
        if self.groupGenerate.isChecked():  # generate sequence
            min = self.spinMin.value()
            max = self.spinMax.value()
        else:                               # shuffle existing list
            if self.listModel.rowCount() < 2: return
            min = 0
            max = self.listModel.rowCount()-2
            
        result = self.master.random.sequences(min=min, max=max, col=1, format='plain', rnd='new')

        if self.groupLoad.isChecked():      # shuffle custom list
            customList =    [self.listModel.index(i,0).data() for i in range(max+1)]
            result =        [customList[int(i)] for i in result]
        
        if self.checkAdd.isChecked() and type(self.result) is list:
            self.result.extend(result)
        else:
            self.result = result
        self.makeTable()

    def log(self, error=None, file=None):
        from time import strftime
        from os.path import basename

        if file:
            msg = "Custom list (%s elem.) was loaded from '%s' for shuffling" % (self.listModel.rowCount()-1, basename(file))
        elif self.groupLoad.isChecked():
            msg = "Custom list with %s element(s) was shuffled" % (self.listModel.rowCount()-1)
        else:
            msg = "Sequence was generated: min=%s max=%s" % (self.spinMin.value(), self.spinMax.value())
        
        self.master.logs.addRow(
            strftime("%d-%m-%Y"), strftime("%H:%M:%S"), self.master.random.__class__.__name__,
            "Sequences Generator/Shuffler", error if error else msg)
Пример #15
0
class MyWidget(QtGui.QWidget, Ui_MyWidget, ResultTable):
    def __init__(self, parent=None, master=None):
        QtGui.QWidget.__init__(self, parent)
        self.master = master
        self.error = self.result = self.model = None
        
        self.column = 1
        
        self.setupUi(self)          # set UI (method from Ui_MyWidget)
        ResultTable.__init__(self)  # set UI for result group widget (result table etc...)
        
        self.btnGenerate.clicked.connect(self.generate)
        self.checkIsSeconds.toggled.connect(self.allowSeconds)
        self.checkIsMili.toggled.connect(self.allowMiliseconds)
                
        self.thread = MyThread(self, self.getRandom)
        self.thread.finished.connect(self.errorHandler)



    # secToTime(64835555, True, True)   -> QTime(18, 0, 35, 555)
    # secToTime(64835, True, False)     -> QTime(18, 0, 35)
    # secToTime(1080, False, False)     -> QTime(18, 0)
    def secToTime(self, units, isSeconds=True, isMilisec=True):   # miliseconds to QTime (65482833 -> QTime(18, 11, 22, 833) 18:11:22.833)
        hour = min = sec = msec = 0
        if isMilisec:
            msec = units % 1000
            units /= 1000
        if isSeconds:
            sec = units % 60
            units /= 60
        min = units % 60
        units /= 60
        hour = units
        return QtCore.QTime(hour, min, sec, msec)

    # timeToSec(QTime(18, 0, 35, 555), True, True)      -> 64835555
    # timeToSec(QTime(18, 0, 35, 555), True, False)     -> 64835
    # timeToSec(QTime(18, 0, 35, 555), False, False)    -> 1080
    def timeToSec(self, qTime, isSeconds=True, isMilisec=True):     # QTime to miliseconds (QTime(23, 59, 59, 999) -> 86399999)
        if isSeconds:
            if isMilisec:
                return (qTime.hour()*3600 + qTime.minute()*60 + qTime.second())*1000 + qTime.msec()
            return qTime.hour()*3600 + qTime.minute()*60 + qTime.second()
        return qTime.hour()*60 + qTime.minute()

    # formatTime(QTime(18, 0, 35, 555)) -> 18:00:35.555
    # formatTime(QTime(18, 0))          -> 18:00
    def formatTime(self, qTime):
        format = self.timeEditFrom.displayFormat()
        return qTime.toString(format)
        

    def allowSeconds(self, isChecked):
        self.checkIsMili.setCheckState(QtCore.Qt.Unchecked)
        self.checkIsMili.setDisabled(not isChecked)
        if isChecked:
            self.timeEditFrom.setDisplayFormat("H:mm:ss")
            self.timeEditTo.setDisplayFormat("H:mm:ss")
        else:
            self.timeEditFrom.setDisplayFormat("H:mm")
            self.timeEditTo.setDisplayFormat("H:mm")
        
    def allowMiliseconds(self, isChecked):
        if isChecked:
            self.timeEditFrom.setDisplayFormat("H:mm:ss.zzz")
            self.timeEditTo.setDisplayFormat("H:mm:ss.zzz")
        else:
            self.timeEditFrom.setDisplayFormat("H:mm:ss")
            self.timeEditTo.setDisplayFormat("H:mm:ss")
        
    def generate(self):       
        self.btnGenerate.setDisabled(True)
        self.thread.start()
        
    def getRandom(self):
        num = self.spinNum.value()
        isSec = self.checkIsSeconds.isChecked()
        isMsec = self.checkIsMili.isChecked()
        interval = self.comboTimeInterval.itemData(self.comboTimeInterval.currentIndex())
        timeStart   = time1 = self.timeToSec( self.timeEditFrom.time(), isSec, isMsec )
        timeEnd     = time2 = self.timeToSec( self.timeEditTo.time(), isSec, isMsec )

        if interval:
            if      isMsec: coef = interval * 60 * 1000
            elif    isSec: coef = interval * 60
            else:   coef = interval
            time1 = 0
            time2 = (timeEnd-timeStart) // coef
        
        
        result = self.master.random.integers(num=num, min=time1, max=time2,
                                             base='10', col=1, format='plain', rnd='new')                   # ['64835555', '573755', '73753'...]
        if interval:
            result = list( map(lambda x: self.secToTime(timeStart + int(x)*coef, isSec, isMsec), result) )  # [QTime(18, 0, 35, 555), QTime(01, 10, 35, 105)...]
        else:
            result = list( map(lambda x: self.secToTime(int(x), isSec, isMsec), result) )                   # [QTime(18, 0, 35, 555), QTime(01, 10, 35, 105)...]
        result = list( map(self.formatTime, result) )                                                       # ['18:00:35.555', '01:10:35.105'...]
        
        if self.checkAdd.isChecked() and type(self.result) is list:
            self.result.extend(result)
        else:
            self.result = result
        # print(self.result)
        self.makeTable()
        
        
    def log(self, error=None):
        from time import strftime
        self.master.logs.addRow(strftime("%d-%m-%Y"),
                                strftime("%H:%M:%S"),
                                self.master.random.__class__.__name__,
                                "Time Generator",
                                error if error else "Generated %s clock time(s) between %s and %s with interval %s" % (
                                    self.spinNum.value(),
                                    self.timeEditFrom.textFromDateTime(self.timeEditFrom.dateTime()),
                                    self.timeEditTo.textFromDateTime(self.timeEditTo.dateTime()),
                                    self.comboTimeInterval.currentText())
                                )
Пример #16
0
class MyWidget(QtGui.QWidget, Ui_MyWidget, ResultTable):
    def __init__(self, parent=None, master=None):
        QtGui.QWidget.__init__(self, parent)
        self.master = master
        self.error = self.result = self.model = None
        self.daysOfWeek = [0,1,2,3,4]
        
        self.column = 1
        
        self.setupUi(self)          # set UI (method from Ui_MyWidget)
        ResultTable.__init__(self)  # set UI for result group widget (result table etc...)
        
        self.btnGenerate.clicked.connect(self.generate)
        self.chkMon.toggled.connect(lambda x: self.updateDaysOfWeek(x, 0))
        self.chkTue.toggled.connect(lambda x: self.updateDaysOfWeek(x, 1))
        self.chkWed.toggled.connect(lambda x: self.updateDaysOfWeek(x, 2))
        self.chkThr.toggled.connect(lambda x: self.updateDaysOfWeek(x, 3))
        self.chkFri.toggled.connect(lambda x: self.updateDaysOfWeek(x, 4))
        self.chkSut.toggled.connect(lambda x: self.updateDaysOfWeek(x, 5))
        self.chkSun.toggled.connect(lambda x: self.updateDaysOfWeek(x, 6))
            
        self.thread = MyThread(self, self.getRandom)
        self.thread.finished.connect(self.errorHandler)

    def updateDaysOfWeek(self, isChecked, day):
        if isChecked:   self.daysOfWeek.append(day)
        else:           self.daysOfWeek.remove(day)
        
    def generate(self):       
        self.btnGenerate.setDisabled(True)
        self.thread.start()
        
    def getRandom(self):
        assert self.daysOfWeek, "Error: You should choose at least one day of the week"
        
        from datetime import date, timedelta
        day = timedelta(days=1)
        
        num = self.spinNum.value()
        date1 = currDate = self.dateEdit.date().toPyDate()
        date2 = self.dateEdit_2.date().toPyDate()
        format = self.comboFormat.itemData(self.comboFormat.currentIndex())
        
        assert date2 > date1, "Error: Second date must be greater than first one"
        
        allDaysList = []
        while currDate != date2:
            if currDate.weekday() in self.daysOfWeek:
                allDaysList.append(currDate)
            currDate += day
        
        assert num <= len(allDaysList), "Error: There are only %s acceptable dates, when you need %s" % (len(allDaysList), num)

        result = []
        if len(allDaysList) == num:
            result = allDaysList
        else:
            while len(result) < num:
                result.append(
                    allDaysList.pop(
                        int( self.master.random.integers(num=1, min=0, max=len(allDaysList)-1, base='10', col=1, format='plain', rnd='new')[0] )
                    )
                )

        result = [d.strftime(format) for d in result]      
                                            
        if self.checkAdd.isChecked() and type(self.result) is list:
            self.result.extend(result)
        else:
            self.result = result
        # print(self.result)
        self.makeTable()
        
        
    def log(self, error=None):
        from time import strftime
        self.master.logs.addRow(strftime("%d-%m-%Y"),
                                strftime("%H:%M:%S"),
                                self.master.random.__class__.__name__,
                                "Date Generator",
                                error if error else "Generated %s date(s) between %s and %s" % (
                                    self.spinNum.value(),
                                    self.dateEdit.textFromDateTime(self.dateEdit.dateTime()),
                                    self.dateEdit_2.textFromDateTime(self.dateEdit_2.dateTime()))
                                )
Пример #17
0
 def thFertilizer(num, delay, arr):
     fer = MyThread(fertilizer, (num, delay, arr))
     fer.start()
     fer.join()
Пример #18
0
class MyWidget(QtGui.QWidget, Ui_MyWidget, ResultTable):
    def __init__(self, parent=None, master=None):
        QtGui.QWidget.__init__(self, parent)
        self.master = master
        self.error = self.result = self.model = None
        
        self.base = "10"
        self.column = 1
        
        self.setupUi(self)          # set UI (method from Ui_MyWidget)
        ResultTable.__init__(self)  # set UI for result group widget (result table etc...)
        
        self.fillPresetsList()
        
        self.btnGenerate.clicked.connect(self.generate)
        self.radioBin.clicked.connect(lambda: setattr(self, "base", "2")) # in lambda can't use '=' operator
        self.radioOct.clicked.connect(lambda: setattr(self, "base", "8"))
        self.radioDec.clicked.connect(lambda: setattr(self, "base", "10"))
        self.radioHex.clicked.connect(lambda: setattr(self, "base", "16"))
        self.comboPresets.activated["int"].connect(self.setPreset)
        
        self.thread = MyThread(self, self.getRandom)
        self.thread.finished.connect(self.errorHandler)

    def fillPresetsList(self):
        for preset in PRESETS["Integers"]:
            title = "%s - %s" % (preset, repr(PRESETS["Integers"][preset]))
            self.comboPresets.addItem(title, PRESETS["Integers"][preset])

    def setPreset(self, index):
        if index == 0: return
        # tuple stored in comboBox itemData - (a, b) where a-min, b-max
        self.spinMin.setValue(self.comboPresets.itemData(index)[0])
        self.spinMax.setValue(self.comboPresets.itemData(index)[1])

    def generate(self):
        self.btnGenerate.setDisabled(True)
        self.thread.start()
        
    def getRandom(self):
        result = self.master.random.integers(num=self.spinNum.value(),
                                             min=self.spinMin.value(),
                                             max=self.spinMax.value(),
                                             base=self.base,
                                             col=1, format='plain', rnd='new')
        if self.checkAdd.isChecked() and type(self.result) is list:
            self.result.extend(result)
        else:
            self.result = result
        # print(self.result)
        self.makeTable()

    def log(self, error=None):
        from time import strftime
        self.master.logs.addRow(strftime("%d-%m-%Y"),
                                strftime("%H:%M:%S"),
                                self.master.random.__class__.__name__,
                                "Integers Generator",
                                error if error else "Generated: num=%s min=%s max=%s" % (self.spinNum.value(),
                                                                                         self.spinMin.value(),
                                                                                         self.spinMax.value()))
Пример #19
0
class Server(QtCore.QObject):
    new_client_signal = QtCore.pyqtSignal(int)  #每连接一个client,就向ui发一个信号,更新状态栏

    # 构造函数
    def __init__(self):
        super().__init__()
        self.SaveSelfIP()  # 提取缓存本地ip
        self.__running_client_cnt = 0  # 当前连接的客户端数量
        self.__thread_cnt = 0  # 线程计数
        self.__sub_thread = dict(
        )  # 每个client线程有一个Frame对象空间,用字典管理。元素构成 (线程名:[Frame对象,thread对象,Lock对象,所属客户端ID])
        self.__sub_thread_union = dict(
        )  # 每一个客户端会和服务器建立多条连接(主连接用来更新UI、心跳连接用来检测断连、数据连接用来传输数据)
        # 用一个字典管理同一个client的所有连接。元素构成 (所属客户端ID:[心跳线程名,主线程名,文件线程名...])
        self.__sub_thread_heart = []  # 所有心跳线程集中到这。
        self.__died_client = []  # 断开的客户端ID暂存在这里,当其所有相关线程关闭后清除此项

    # 缓存本机ip地址 (构造一个UDP包但不发送 ,从中提取)
    def SaveSelfIP(self):
        self.__ip = CheckIp()

    # 获取本机IP
    def GetIP(self):
        return self.__ip

    # 启动服务器(创建监听线程和套接字)
    def ServerStart(self, port):
        # 创建一个监听套接字
        print("server:创建了监听套接字")
        self.__server_socket = socket.socket(
            socket.AF_INET, socket.SOCK_STREAM)  # 创建用于监听的socket
        self.__server_socket.setblocking(False)  # 配置为非阻塞的socket
        self.__server_is_listening = False

        # 设置并绑定监听的端口
        print("server:设置并绑定port:{}".format(port))
        self.__server_socket.bind(("", port))
        self.__port = port

        # 启动监听线程
        self.__sub_thread.clear()  # 清空子线程记录
        self.__listenThread = MyThread("监听线程", self.Listen)
        self.__listenThread.setDaemon(True)  #设置为守护线程,程序结束时强行结束监听
        self.__listenThread.start()

    # 关闭服务器(关闭所有子线程和套接字)
    def ServerShutDown(self):
        print("server:停止监听")
        self.__server_is_listening = False  # 通过共享内存和子线程线程通信,关闭所有子线程和客户端线程
        self.__listenThread.join()  # 等待监听线程和所有客户端线程结束
        print("server:监听套接字关闭")
        self.__server_socket.close()
        self.__running_client_cnt = 0

# 用于数据收发的基础方法---------------------------------------------------------------------------
# socket接受

    def BytesRecv(self, client_socket, client_name, max_size):
        data = None
        timeout = 0
        ID = self.__sub_thread[client_name][2]  # 此线程所属客户端ID
        while data == None and self.__server_is_listening and not ID in self.__died_client:
            try:
                data = client_socket.recv(max_size)
            except BlockingIOError:  # 非阻塞socket,pass此异常以实现轮询
                pass
            except ConnectionAbortedError:
                if client_name in self.__sub_thread_heart:  # 客户端断开,可能出这个异常
                    self.HeartStop(client_name)
                return '连接断开'
            except ConnectionResetError:  # 客户端断开,可能出这个异常
                if client_name in self.__sub_thread_heart:
                    self.HeartStop(client_name)
                return '连接断开'
            except socket.timeout:
                if client_name in self.__sub_thread_heart:  # 只对心跳线程做超时判断
                    timeout += 5
                    print(client_name, '连接超时', timeout)
                    if timeout == 10:
                        self.HeartStop(client_name)
                        return '连接断开'
        if not self.__server_is_listening or data == b'':  # 客户端断开,data返回空串
            return '连接断开'
        return data

    # 线性安全的socket发送
    def BytesSend(self, client_socket, data):
        client_socket.send(data)

    # 准备好接收(获取分片数)
    def GetReady2Recv(self, client_socket, client_name):
        frame = self.__sub_thread[client_name][0]

        # 接受本次通信分片数
        data = self.BytesRecv(client_socket, client_name, 256)
        if data == '连接断开':
            return '连接断开'

        frame_num = frame.DecodeFrameNum(client_name, data)
        if frame_num == -1:
            return 'crc error'

        print(client_name, '本次接收分片数', frame_num)

        # 返回分片数应答
        frame.Reset()
        ack_data = '分片{}'.format(frame_num).encode('utf-8')
        frame.Code(ack_data)
        client_socket.send(ack_data)

        return frame_num

    def GetReady2Send(self, client_socket, client_name, size, isDownload):
        frame = self.__sub_thread[client_name][0]

        # 发送本次通信分片数
        max_size = frame.GetLoadNum()  # 最大负载长字节
        n = math.ceil(size / max_size)

        print(client_name, '本次发送分片数', n)
        frame.Reset()
        if isDownload:
            n_data = frame.Code(n.to_bytes(length=8, byteorder="big"))
        else:
            n_data = frame.Code(n.to_bytes(length=1, byteorder="big"))

        self.BytesSend(client_socket, n_data)

        # 确定客户端已经装备好接受
        ack_n = self.BytesRecv(client_socket, client_name,
                               1024).decode('utf-8')
        print(client_name, 'ack:', ack_n)
        if ack_n == '连接断开':
            return '连接断开'
        if ack_n != '分片{}'.format(n):
            return '分片通信错误'
        print(client_name, "已准备好发送")
        return 'OK'

    # 接受数据
    def DataRecv(self, client_socket, client_name):
        frame = self.__sub_thread[client_name][0]

        # 先准备好接受(接受分片数)
        frame_num = self.GetReady2Recv(client_socket, client_name)
        if not type(frame_num) == int:
            return frame_num

        print(client_name, "准备接收分片", frame_num)

        # 开始接受并整合所有数据
        i = 0
        data = b''
        while i < frame_num:
            # 限制每次收帧长,可以解决部分粘包问题
            data_f = self.BytesRecv(client_socket, client_name, 256)
            data, n, errCnt = frame.Decode(client_name, data_f, data)
            if errCnt != 0:
                print(client_name, '数据接收结束,校验错误')
                return 'crc error'
            i += n

        #print(client_name,"有效数据 ",data)
        print(client_name, '数据接收结束,成功')
        return data

    # 发送数据
    def DataSend(self, client_socket, client_name, data):
        frame = self.__sub_thread[client_name][0]

        # 准备好发送
        res = self.GetReady2Send(client_socket, client_name, len(data), False)
        if res != 'OK':
            return res

        # 发送所有分片
        max_size = frame.GetLoadNum()  # 最大负载长字节
        frame.Reset()
        while len(data) > max_size:
            sub_data = data[0:max_size]
            data = data[max_size:]
            file_content = frame.Code(sub_data)  # 拼数据帧
            self.BytesSend(client_socket, file_content)  # 发送数据

        # 发送最后一个分片
        file_content = frame.Code(data)  # 拼数据帧
        self.BytesSend(client_socket, file_content)  # 发送数据

        print(client_name, "数据发送完成--------------------\n")
        return '发送完成'

# 利用基本收发方法封装的一些方法------------------------------------------------------------------
# 发送path路径下的文件和目录信息

    def SendListDir(self, client_socket, client_name, path):
        print(client_name, "请求目录", path)
        try:
            items = os.listdir(path)  # 获取路径下所有文件名
        except PermissionError:
            print("无访问权限")
            self.DataSend(client_socket, client_name, '无访问权限'.encode('utf-8'))
            return

        # 分离文件和文件夹
        floders = []
        files = []
        sizes = []
        for item in items:
            file_path = os.path.join(path, item)
            if os.path.isdir(file_path):
                floders.append(item)
            else:
                size = str(round(os.stat(file_path).st_size / 1024))
                files.append(item)
                sizes.append(size)

        floder_str = '/'.join(floders)
        files_str = '/'.join(files)
        size_str = '/'.join(sizes)
        list_str = floder_str + '<>' + files_str + '<>' + size_str

        self.DataSend(client_socket, client_name, list_str.encode('utf-8'))

    def DownloadFile(self, client_socket, client_name, file_path):
        # 计算分片数
        frame = self.__sub_thread[client_name][0]
        max_size = frame.GetLoadNum()  # 最大负载长字节
        size = os.stat(file_path).st_size
        frame_num = math.ceil(size / max_size)

        # 准备好发送数据
        res = self.GetReady2Send(client_socket, client_name, size, True)
        if res != 'OK':
            return res

        # 发送文件数据
        print(client_name, '开始发送文件')
        with open(file_path, "rb") as f:  # 直接以二进制读入,传输时不用encode和decode了
            frame.Reset()
            for i in range(frame_num):
                data = f.read(max_size)  # 最多读最大负载长字节
                file_content = frame.Code(data)  # 获取帧的字节流数据
                print(client_name, len(file_content))
                client_socket.send(file_content)

        # 关闭传输socket
        print(client_name, '文件发送完毕')
        client_socket.close()

    def UploadFile(self, client_socket, client_name):
        frame = self.__sub_thread[client_name][0]
        frame.Reset()

        # 接收文件名
        file_name = self.DataRecv(client_socket, client_name)
        if not type(file_name) == bytes:
            return file_name
        file_name = file_name.decode('utf-8')
        print(client_name, '上传请求', file_name)

        # 接收并应答分片数
        frame_num = self.GetReady2Recv(client_socket, client_name)  # 分片数
        if not type(frame_num) == int:
            return frame_num

        # 接受文件数据
        i = 0
        errCnt = 0
        desktop_path = GetDesktopPath()
        with open(desktop_path + "\\[upload]" + file_name, "wb") as f:
            while i < frame_num:
                # 限制每次收帧长,可以自动进行粘包处理
                data_f = self.BytesRecv(client_socket, client_name, 256)
                if data_f == '连接断开'.encode('utf-8'):
                    return

                data, n, err = frame.Decode(client_name, data_f)
                errCnt += err
                f.write(data)
                i += n

        # 关闭传输socket
        print(client_name, '错误帧数:', errCnt)
        client_socket.close()

# 接受数据后的处理--------------------------------------------------------------------------------
# 客户端子线程(非阻塞socket):接收客户端的各种请求

    def SubClientThread(self, client_socket, client_name):
        print(client_name + ":线程启动")

        # 给此线程一个Frame对象,用来构成帧
        if not client_name in self.__sub_thread:
            self.__sub_thread[client_name] = [
                Frame(), threading.currentThread(), ''
            ]  #字典可自动添加

        # 轮询处理客户端的命令
        while self.__server_is_listening:
            # 先检查此线程对应的客户端是不是已经断开连接,如果断开了,关闭连接
            thread_id = self.__sub_thread[client_name][2]
            if thread_id in self.__died_client:
                break

            data = self.DataRecv(client_socket, client_name)
            if type(data) == bytes:
                data = data.decode('utf-8')
            print(client_name, "接收数据", data, '-----------------------------\n')

            if data == '连接断开':
                break
            # client主线程发起注册
            elif data == 'login new client':
                self.Login(client_socket, client_name)
            # client子线程注册
            elif data in self.__sub_thread_union:
                self.__sub_thread[client_name][2] = data
                if not client_name in self.__sub_thread_union[data]:
                    self.__sub_thread_union[data].append(client_name)
            # 发送桌面
            elif data == "获取桌面":
                desktop_path = GetDesktopPath()
                if self.DataSend(client_socket, client_name,
                                 desktop_path.encode('utf-8')) == '连接断开':
                    self.StopSubThread(client_socket, client_name)
                    print(client_name, "通信结束")
                    break
            # client心跳
            elif data[:5] == 'heart':
                ID = data[6:]
                if not client_name in self.__sub_thread_union[ID]:
                    self.__sub_thread_union[ID].append(client_name)
                if not client_name in self.__sub_thread_heart:
                    self.__sub_thread_heart.append(client_name)
            # 上传
            elif data == 'upload':
                self.UploadFile(client_socket, client_name)
                break
            # 判断为目录则刷新
            elif os.path.isdir(data):
                self.SendListDir(client_socket, client_name, data)
            # 判断为文件则下载
            elif os.path.isfile(data):
                self.DownloadFile(client_socket, client_name, data)
                break
            else:
                pass

        self.StopSubThread(client_socket, client_name)
        print(client_name, "通信结束")

# 线程控制相关--------------------------------------------------------------------------------
# 结束子线程

    def StopSubThread(self, client_socket, client_name):
        # 从客户端线程集中清除此线程
        thread_id = self.__sub_thread[client_name][2]
        self.__sub_thread_union[thread_id].remove(client_name)

        # 如果这是断开的客户端的线程,且此断开客户端线程集已清空,把这个客户端ID移除
        if thread_id in self.__died_client and not self.__sub_thread_union[
                thread_id]:
            del self.__sub_thread_union[thread_id]
            self.__died_client.remove(thread_id)

        # 从全体线程集中清除此线程记录
        del self.__sub_thread[client_name]

        client_socket.close()
        self.__running_client_cnt -= 1
        self.new_client_signal.emit(self.__running_client_cnt)  # 向ui发信号,更新ui

    # 心跳线程断开后的处理
    def HeartStop(self, heart_name):
        self.__sub_thread_heart.remove(heart_name)  # 从心跳列表中移除此线程
        ID = self.__sub_thread[heart_name][2]  # 获取心跳超时的客户端ID
        self.__died_client.append(ID)  # 此心跳对应的客户端ID加入死亡client列表

    # 监听线程中启动监听socket,允许被动连接
    def Listen(self):
        print("server:开始监听")
        self.__server_socket.listen(128)
        self.__server_is_listening = True

        while self.__server_is_listening:
            try:
                client_socket, client_addr = self.__server_socket.accept(
                )  # 设置setblocking(False)后, accept不再阻塞
                print("连接成功,客户端ip:{},port:{}".format(client_addr[0],
                                                     client_addr[1]))

                # 一旦连接成功,开一个子线程进行通信
                client_socket.setblocking(False)  # 子线程是非阻塞模式的(需要循环判断监听线程退出)
                client_socket.settimeout(5)  # 超时值设为5s
                self.__running_client_cnt += 1
                self.__thread_cnt += 1
                self.new_client_signal.emit(
                    self.__running_client_cnt)  # 向ui发信号,更新ui
                client_name = "client{}".format(self.__thread_cnt)  # 创建子线程
                client_thread = MyThread(client_name, self.SubClientThread,
                                         [client_socket, client_name])
                client_thread.setDaemon(True)  # 子线程配置为守护线程,主线程结束时强制结束
                client_thread.start()  # 子线程启动

            except BlockingIOError:
                pass

    # 新连接注册
    def Login(self, client_socket, client_name):
        print('注册新client')
        # 生成一个唯一的key
        key = ''.join(random.sample('abcdefghijklmnopqrstuvwxyz', 10))
        while key in self.__sub_thread_union:
            key = ''.join(random.sample('abcdefghijklmnopqrstuvwxyz', 10))

        # 主线程加入字典
        self.__sub_thread_union[key] = [client_name]
        self.__sub_thread[client_name][2] = key

        # 返回key
        self.DataSend(client_socket, client_name, key.encode('utf-8'))
Пример #20
0
 def showQuota(self):
     thread = MyThread(self, lambda: self.sb.label2.setText("Your quota (random bits for today): %s" % self.random.quota(format='plain')[0]))
     thread.finished.connect(self.errorHandler)
     thread.start()