如何防止Schedule阻塞主线程?

时间:2020-06-07 06:14:51

标签: python multithreading scheduled-tasks python-multithreading

我有一个程序,使用Python的Schedule包启动该程序后,该程序会在特定时间点拍摄网络摄像头图像。我的问题是,当我在另一个类中调用该类时,它将阻塞主线程。我试图在另一个构建Tkinter UI的程序中调用“ webcamPic”。但是,调用webcamPic时不会构建UI。我目前正在使用“ schedule_run_pending()”运行时间表。我知道我应该使用run_continously(),但由于它不是标准Schedule库的一部分,所以我不知道如何调用该库或为此导入什么库。我当前的代码如下。除主要功能外,大多数都应该无关紧要。有人可以告诉我如何在另一个类中调用webcamPic而不阻塞主线程。

import threading
import time
from time import sleep
import cv2
from datetime import datetime
import random
import os
from WindowsInhibitor import *
from captureImage import *
import schedule
from preventSleep import *




class webcamPic:
    def __init__(self, name):
        # preventSleep()
        self.name = name
        self.time1, self.time2, self.images = [], [], []
        print("time1:", self.time1)
        print("time2:", self.time2)
        self.startHour = int(datetime.now().strftime('%H'))
        self.startMin = int(datetime.now().strftime('%M'))
        self.string = ""
        self.main()

    def job(self):
        self.string = self.string.replace(":", "")

        self.string = date.today().strftime("-%Y-%m-%d-") + datetime.now().strftime('%H-') + datetime.now().strftime(
            '%M')
        captureImage(self.name, self.string, self.images)
        print(self.string)
        print("images array:", self.images)
        return schedule.CancelJob


    def hourlyCheck(self):
        random.seed(datetime.now())
        self.time1.clear()
        self.time2.clear()
        self.time1.extend(random.sample(range(2, 31), k=2))
        self.time1.sort()
        self.time2.extend(random.sample(range(31, 61), k=2))
        self.time2.sort()
        print("time1:", self.time1)
        print("time2:", self.time2)

    def everyHour(self):
        print("every")
        self.hourlyCheck()
        for i in self.time1:
            formattedTime = ":" + ("{:02d}".format(i))
            self.string = datetime.now().strftime('%H') + formattedTime
            schedule.every().hour.at(formattedTime).do(self.job)
        for i in self.time2:
            formattedTime = ":" + ("{:02d}".format(i))
            self.string = datetime.now().strftime('%H') + formattedTime
            schedule.every().hour.at(formattedTime).do(self.job)
        print("everyhour")

    # after first hour of pictures
    def afterFirstHour(self):
        print("after first hour")
        schedule.every().hour.at(":01").do(self.everyHour)

    # first hour of pictures
    def firstHour(self):
        print("first hour")
        self.time1.clear()
        self.time2.clear()
        if self.startMin < 30:
            if self.startMin < 27:
                self.time1.extend(random.sample(range(self.startMin + 1, 31), k=2))
                self.time1.sort()
                print("time1:", self.time1)
                for i in self.time1:
                    formattedTime = ":" + ("{:02d}".format(i))
                    self.string = datetime.now().strftime('%H') + formattedTime
                    schedule.every().hour.at(formattedTime).do(self.job)
            self.time2.extend(random.sample(range(31, 61), k=2))
            self.time2.sort()
            print("time2:", self.time2)
            for i in self.time2:
                formattedTime = ":" + ("{:02d}".format(i))
                self.string = datetime.now().strftime('%H') + formattedTime
                schedule.every().hour.at(formattedTime).do(self.job)
        else:
            if self.startMin <= 56:
                self.time2.extend(random.sample(range(self.startMin + 1, 61), k=2))
                self.time2.sort()
                print(self.time2, "time2")
                for i in self.time2:
                    formattedTime = ":" + ("{:02d}".format(i))
                    self.string = datetime.now().strftime('%H') + formattedTime
                    schedule.every().hour.at(formattedTime).do(self.job)

    def main(self):
        schedule.every(10).minutes.do(preventSleep)
        # first hour
        self.firstHour()
        # after first hour
        formattedTime = ("{:02d}".format(self.startHour + 1)) + ":00"
        schedule.every().day.at(formattedTime).do(self.afterFirstHour)

        while True:
            schedule.run_pending()
            sleep(1)


if __name__ == '__main__':
    webcamPic("NAME")

0 个答案:

没有答案
相关问题