Несколько потоков в последовательности при обновлении меток Kivy?РЕШИТЬ - PullRequest
0 голосов
/ 05 июня 2019

У меня возникла проблема с последовательным обновлением ярлыков после запуска потоков в приложении Kivy.Ярлыки обновляются просто отлично, но, очевидно, они будут обновляться в разное время, в зависимости от того, когда закончились их соответствующие потоки.Я бы хотел, чтобы они обновлялись сверху вниз (с начала до конца), пока следующий поток ожидает завершения текущего.Во время этого процесса пользователь должен иметь возможность нажимать на другие виджеты в моем приложении.Заранее спасибо!

Я пытался использовать класс Clock с интервалом 1, но это замораживает мое приложение.Сейчас я пытаюсь создать потоки и установить каждый демон для каждого потока, равный 1, чтобы я мог нажимать на другие кнопки во время процесса.К сожалению, то, что у меня сейчас, не включает следующий поток, ожидающий завершения тока.

это функция, которая создает потоки при нажатии кнопки «Пуск»

def startDeployment(self, event):
    # disable button
    self.StartButton.disabled = True
    # change button text to 'Running'
    self.StartButton.text = 'Running'
    # disable pause button
    self.PauseButton.disabled = False
    # enable the stop button
    self.StopButton.disabled = False
    # start deployment
    threads = []
    for task in self.tasks:
        statusLabel = self.statusLabels[self.tasks.index(task)]
        task = task.rstrip()
        task = task.split(";")
        taskOp = task[1]
        taskArg = task[2]
        thread = threading.Thread(target=self.executeTask, args=(taskOp, taskArg, statusLabel))
        threads.append(thread)

    threading.Thread(target=self.threadControl, args=(threads,)).start()

это функция, которая фактически выполняет задачи

def executeTask(self, taskOperation, taskArgument, statusLabel):
    proc = subprocess.Popen(
        [taskOperation,taskArgument],
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        shell=True)

    stdout, stderr = proc.communicate()

    global output
    global error

    output = stdout.decode()
    error = stderr.decode()

    for child in self.statusLayout.children:
        if child == statusLabel:
            Clock.schedule_once(partial(self.updateStatusLabel,child), 0.25)

    return(None)

мой метод threadControl

def threadControl(self, threads):
    for thread in threads:
        thread.daemon = True
        thread.start()
        thread.join()

    return(None)

и мое обновление метки состояния

def updateStatusLabel(self, statusLabel, dt):
    statusLabel.text = 'Done'
    return(None)

Я ожидаю, что мойярлыки внутри моего прокрутки, чтобы обновлять их последовательно, сверху вниз, последовательно / в хронологическом порядке.Вместо этого они обновляются в зависимости от завершения потока.Конечно, это тот случай, когда я просто не знаю, как заставить каждый поток ждать завершения ранее выполненного потока.

...