2015-04-07 5 views
1

У меня есть довольно большая программа, которая загружает некоторые данные из файла excel и заполняет форму, это может занять много времени из-за размера файла, поэтому я переместили функцию загрузки на отдельный поток, единственная проблема по какой-то причине в этом новом потоке. Я не получаю автоматическую трассировку стека на консоли всякий раз, когда возникает ошибка. Он просто терпел неудачу, что отталкивает его от реальной боли.Автоматическая трассировка стека не указана в потоках, отличных от основного потока

Я использую pydev в eclipse, я написал следующий тестовый пример, чтобы убедиться, что все работает правильно.

from PyQt4 import QtCore 

class OtherThread(QtCore.QThread): 


    def __init__(self): 
     super(OtherThread, self).__init__() 

    def run(self): 
     try: 
      print(1/0) 
     except Exception as e: 
      print("exception caught in other thread: \n{0}".format(e)) 

class MainThread(): 

    def __init__(self): 
     self.otherThread = OtherThread() 

    def run(self): 
     try: 
      print(1/0) 
     except Exception as e: 
      print("exception caught in main thread: \n{0}".format(e)) 

     self.otherThread.run() 

def main(): 
    mainThread = MainThread() 

    mainThread.run() 

if __name__ == '__main__': 
    main() 

Когда я запускаю это как исключения перехватываются должным образом и когда я закомментировать блок TRY в объекте протектора также работает нормально, я получаю мой трассировки стека, как и ожидалось. Я действительно в недоумении относительно того, что происходит. Есть ли что-то, что я мог бы сделать, чтобы вызвать такое поведение?

Код программы, в которых я работаю.

def run(self): 
     print("excel thread running") 

     workbook = xlrd.open_workbook(self.path) 
     worksheet = workbook.sheet_by_name('PNA Form') 
# 
     currentRow = 13 # start grabbing pna data 
     numRowStart = currentRow 
     newPartCol= 0 
     oldPartCol = 10 
     descriptionCol = 2 
# 
     numberOfRows = worksheet.nrows - 1 
#  
     print("number of rows = {0}".format(numberOfRows)) 
     PNA = [] 
#   
     current_color = False 
     while (currentRow < numberOfRows): 

      print("about to parse excel rows") 
      newPartCell = int(worksheet.cell(currentRow,newPartCol).value) 
      oldPartCell = int(worksheet.cell(currentRow,oldPartCol).value) 
      descriptionCell = QtCore.QString(worksheet.cell(currentRow,descriptionCol).value) 

      print("excel rows parsed: {0}, {1}, {2}, {3}".format(oldPartCell,newPartCell,descriptionCell,current_color)) 

      print("running line excel row {0}: {1}".format(currentRow, str(descriptionCell))) 
      if not self.isStrikethrough(currentRow,0): #make sure the line does not have strike through 
       #self.guiHandel.BOMVal.addPNARow(oldPN = oldPartCell, newPN = newPartCell, disc = descriptionCell) 
       print("about to emit pna row tracker for {0}".format(descriptionCell)) 
       self.addPNARowTracker.emit(oldPartCell,newPartCell,descriptionCell) 
       print("thread still running after pna row tracker emit") 

      if (oldPartCell != "" and not self.isStrikethrough(currentRow,0)): 
       PNA.append((num(oldPartCell),num(newPartCell))) 
       current_color = not current_color 
       #self.guiHandel.pnaVerticalLayoutScroll.addWidget(PNACell(oldPartCell,newPartCell,descriptionCell,color = current_color)) 
       print("about to emit addPNARow: {0}, {1}, {2}, {3}".format(oldPartCell,newPartCell,descriptionCell,current_color)) 
       self.addPNARow.emit(oldPartCell,newPartCell,descriptionCell,current_color) 
       #self.guiHandel.widgetStack.append(PNACell(oldPartCell,newPartCell,descriptionCell,color = current_color)) 
       print("thread still running after add pna row emit") 

      currentRow += 1 

      #self.guiHandel.pbar.setValue(int(100*(currentRow-13)/numberOfRows)) 
      print("currentRow =",currentRow) 
      self.updateProgress.emit(int(100*(currentRow-numRowStart)/(numberOfRows-numRowStart))) 

     print(PNA) 
     self.done.emit() 

Это консольный выход, когда он терпит неудачу.

slot add pna row tracker called 
running is about to return 
about to emit addPNARow: 28458820, 28489881, INST CSTR-ASM,DIESEL,KM,UP,GAT, False 
thread still running after add pna row emit 
('currentRow =', 29slot add pna row called) 

about to parse excel rows 
Added addPNARow: 28458820, 28489881, INST CSTR-ASM,DIESEL,KM,UP,GAT, False 
excel progress update called ------- progress = 20 

При запуске через отладчик останавливается на этой линии:

newPartCell = int(worksheet.cell(currentRow,newPartCol).value) 

Я попытался окружив его попробовать блок, но он никогда не получил исключение. Ячейка, которую он пытается читать, пустая.

Что здесь происходит? Любые идеи очень приветствуются.

+0

Я только что подтвердил, что пустая строка является то, что заставляет его висеть. Я сделал тестовый пример с пустой строкой для 5-й строки ввода, и она не удалась. Однако я не понимаю, почему это почти тот же код, который я использовал, когда все это было сделано в одном потоке. – Michael

+0

удалил функции int() и QString, и теперь код выполняется до конца правильно, EX: 'newPartCell = int (workheet.cell (currentRow, newPartCol) .value)' to 'newPartCell = workheet.cell (currentRow, newPartCol) .value' Я все равно хотел бы знать, почему ошибки в этом потоке не пойманы должным образом, хотя. – Michael

+0

В моем предыдущем комментарии было сказано, что он выполняется правильно. Это не так, кажется, что сигналы передают числовые данные в виде тарабарщины, все выходит вдвое больше, чем должно быть. – Michael

ответ

0

Ответ на этот вопрос находится здесь: error in pyqt qthread not printed

В основном вам нужно вручную инкапсулировать весь метод запуска объекта QThread, а затем вручную повторно выдать ошибки в стандартный вывод