Как я могу использовать QDateTime внутри потока? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть поток, где мне нужно выполнить тяжелую функцию.

Во-первых, у меня есть функция, которая берет два QDateTime значения из графического интерфейса и преобразует их в метки времени UNIX.Во-вторых, «тяжелая» функция использует эти значения для выполнения задачи.

Обе функции (function_task, time_converter_to_unix) не принадлежат ни к какому классу, поэтому, насколько я знаю, я могу использовать их в потоке.

Но не параметры, так как я не могу получить доступ к значениям QDateTime.

Ошибка: AttributeError: у объекта 'TaskThread' нет атрибута 'startTime'

Как получить доступ к QDateTime и прочитать содержимое из ветки?Спасибо.

РЕДАКТИРОВАТЬ: Полный код.Вы также можете найти ссылку на графический интерфейс в следующей ссылке: interface.ui

import sys
import datetime
import time

from PyQt4 import QtCore, QtGui, uic
from PyQt4.QtCore import *
from PyQt4.QtGui import *

# Link to GUI
qtCreatorFile = "interface.ui"

Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)

def time_converter_to_unix(start_datetime, end_datetime):
    # Convert QTimeEdit to UNIX Timestamp (int, msec included), and then to float
    start_datetime_unix_int = start_datetime.toMSecsSinceEpoch ()
    start_datetime_unix = (float(start_datetime_unix_int) / 1000)

    end_datetime_unix_int = end_datetime.toMSecsSinceEpoch ()
    end_datetime_unix = (float(end_datetime_unix_int) / 1000)

    return start_datetime_unix, end_datetime_unix

def dummy_function(self, start_datetime_unix, end_datetime_unix): 
    # Dummy function, just to simulate a task 
    result = start_datetime_unix + end_datetime_unix 
    print result    

class Tool(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, parent = None):

        # Setting-ip UI
        QtGui.QMainWindow.__init__(self)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)

        # Button Action
        self.runButton.clicked.connect(self.onStart)

        # Progress Bar and Label. At the begining, the bar is at 0
        self.progressBar.setValue(0)
        self.progressBar.setRange(0,100)
        self.resultLabel.setText("Waiting...")  

        #Thread
        self.myLongTask = TaskThread()
        self.myLongTask.taskFinished.connect(self.onFinished)        

    def onStart(self):      
        # Before running the thread, we set the progress bar in waiting mode
        self.progressBar.setRange(0,0)
        self.resultLabel.setText("In progress...")  

        print "Starting thread..."
        self.myLongTask.start()

    def onFinished(self):
        # Stop the pulsation when the thread has finished
        self.progressBar.setRange(0,1)
        self.progressBar.setValue(1)
        self.resultLabel.setText("Done")  

class TaskThread(QtCore.QThread):  
    taskFinished = QtCore.pyqtSignal()

    def __init__(self):
        QtCore.QThread.__init__(self)

    def __del__(self):
        self.wait()

    def run(self):  
        # First, we read the times from the QDateTime elements in the interface      
        print "Getting times..."
        start_datetime_unix, end_datetime_unix = time_converter_to_unix(self.startTime.dateTime(), self.endTime.dateTime())

        # Then, we put these values in my_function
        print "Executing function..."
        dummy_function(self, start_datetime_unix, end_datetime_unix) 

        # To finish, we execute onFinished.
        print "Finishing thread..."
        self.taskFinished.emit()

def main():
    app = QtGui.QApplication(sys.argv)
    window = Tool()
    window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Если вы выполните его вместе с .ui, вы увидите, что как только мы нажмемв режиме «Выполнить» индикатор выполнения остается в режиме ожидания, и появляется ошибка, указанная выше.

1 Ответ

0 голосов
/ 08 июня 2018

startTime и endTime принадлежат графическому интерфейсу, а не потоку, поэтому вы получаете эту ошибку.

С другой стороны, желательно не обращаться к графическому интерфейсу из другого потокалучше всего получить значения до запуска потока и установить его как свойство потока, как показано ниже:

class Tool(QtGui.QMainWindow, Ui_MainWindow):
    ...       

    def onStart(self):      
        # Before running the thread, we set the progress bar in waiting mode
        self.progressBar.setRange(0,0)
        self.resultLabel.setText("In progress...")  
        self.myLongTask.start_dt = self.startTime.dateTime() # <----
        self.myLongTask.end_dt = self.endTime.dateTime()     # <----

        print "Starting thread..."
        self.myLongTask.start()

    ... 

class TaskThread(QtCore.QThread):  
    ...

    def run(self):  
        # First, we read the times from the QDateTime elements in the interface      
        print "Getting times..."
        start_datetime_unix, end_datetime_unix = time_converter_to_unix(self.start_dt, self.end_dt) # <----

        # Then, we put these values in my_function
        print "Executing function..."
        dummy_function(self, start_datetime_unix, end_datetime_unix) 

        # To finish, we execute onFinished.
        print "Finishing thread..."
        self.taskFinished.emit()
...