Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение QstandartModel из нитей, Непонятки с lock'ами 
:(
    Опции темы
aspolyakov
Дата 16.9.2008, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 13.9.2008
Где: Russia, Urals, Ye katerinburg

Репутация: нет
Всего: нет



Здраствуйте, проблема в том, что не как не получается менять прогресс бар из потоков так, чтобы все изменения были атомарными. Короче привожу весь текст(я решил сделать через QStandartModel). Косяк в том, что потоки все отработали, а бар до 100 не доходит иногда((

Цитата

#!/usr/bin/env python
# -*- coding: cp1251 -*-
#Polyakov © 2008
#Version 0.5.1
try:
    import threading
except ImportError:
    import dummy_threading as threading
import sys, MySQLdb, csv, codecs
from PyQt4 import QtCore, QtGui, uic

Instanse = QtCore.QObject
def trUtf8(Instance, SourceText):
    return QtCore.QObject.trUtf8(Instance, SourceText)
app = QtGui.QApplication(sys.argv)
app.setStyle("Plastique")
form_class, base_class = uic.loadUiType("query.ui")


def generateSqlString( garrison, queryType, month, year, finiteMonth, finiteYear ):
    query = ""
    if (( queryType == 'Код 72' )or( queryType == 'Test' )):
        if ( (month==finiteMonth) and (year==finiteYear) ):
            query = """SELECT `upvd01`.`d`, `upvd01`.`e`, `upvd01`.`f`, `upvd01`.`g` 
               FROM `upvd12` join `upvd01` 
               WHERE `upvd12`.`b`=72 and 
               `upvd01`.`a` = `upvd12`.`a` and 
               `upvd01`.`e`="""+str( garrison )+""" and 
               `upvd12`.`p`="""+str( month )+"""  and 
               `upvd12`.`r`="""+str( year )
        else:
            if (year!=finiteYear):
                query = """SELECT `upvd01`.`d`, `upvd01`.`e`, `upvd01`.`f`, `upvd01`.`g` 
                            FROM `upvd12` join `upvd01` 
                            WHERE `upvd12`.`b`=72 and `upvd01`.`a` = `upvd12`.`a` and `upvd01`.`e`="""+str( garrison )+""" and 
                            ((`upvd12`.`r`<"""+str( finiteYear )+""" and `upvd12`.`r`>"""+str( year )+""") or 
                            (`upvd12`.`p`>="""+str( month )+""" and `upvd12`.`r`="""+str( year )+""" 
                            and `upvd12`.`p`<="""+str( finiteMonth )+""" and `upvd12`.`r`="""+str( finiteYear )+'))'
            else:
                query = """SELECT `upvd01`.`d`, `upvd01`.`e`, `upvd01`.`f`, `upvd01`.`g` FROM `upvd12` join `upvd01` WHERE `upvd12`.`b`=72 and `upvd01`.`a` = `upvd12`.`a` and `upvd01`.`e`="""+str( garrison )+""" and `upvd12`.`p`>="""+str( month )+""" and `upvd12`.`p`<="""+str( finiteMonth )+""" and `upvd12`.`r`="""+str( finiteYear )
    return query

class sqlThread ( threading.Thread ):
     def __init__ ( self, basename, query, model, qmodel, index, progress, lock, dbpasswd = "", dbhost = "localhost", dbuser = "root" ):
        self.basename = basename
        self.dbpasswd = dbpasswd
        self.dbhost = dbhost
        self.dbuser = dbuser
        self.model = model
        self.qmodel = qmodel
        self.query = query
        self.index = index
        self._lock = lock
        self.progress = progress
        threading.Thread.__init__ ( self );
     def run ( self ):
         try:
             rows = self.model.rowCount()
             self.model.removeRows(0, rows)
             self.model.insertRow(0)
             self.model.setData(self.model.index(0, 0), QtCore.QVariant( trUtf8( form,  unicode('Запрос выполняется...', 'cp1251').encode( 'utf8' )) ) )
             dbi = MySQLdb.connect ( host = self.dbhost, user = self.dbuser, passwd = self.dbpasswd, db = self.basename )
             cursor = dbi.cursor()
             cursor.execute( self.query )
             result = dbi.store_result()
             rows = self.model.rowCount()
             self.model.removeRows(0, rows)
             for item in cursor.fetchall():
                         self.model.insertRow( 0 )
                         string = ""
                         string = (str(item[0])).zfill(2)+"/"+(str(item[1])).zfill(2)+"/"+(str(item[2])).zfill(4)+"-"+(str(item[3])).zfill(2)
                         self.model.setData(self.model.index(0, 0), QtCore.QVariant( string ))
     
             self.model.insertRow( 0 )
             self.model.setData( self.model.index(0, 0), QtCore.QVariant( QtCore.QString(trUtf8( form,  unicode('Запрос Успешно завершен', 'cp1251').encode( 'utf8' )) )) )
             dbi.close ( )
             self.qmodel.setData( self.index, QtCore.QVariant( cursor.rowcount ) )
         except MySQLdb.Error, e:
            print "MySQL error ", sys.exc_info()[1][0], "\n Description: ", sys.exc_info()[1]
            self.model.insertRow(0)
            self.model.setData(self.model.index(0, 0), QtCore.QVariant( "MySQL error occured!" ))
            self.qmodel.setData( self.index, QtCore.QVariant( "MySQL error occured!" ) )
         except:
            print "Unexpected error: \n Description: ", sys.exc_info()
            self.model.insertRow(0)
            self.model.setData(self.model.index(0, 0), QtCore.QVariant( trUtf8( form,  unicode('Произошла ошибка во время выполнения', 'cp1251').encode( 'utf8' )) ) )
         finally:
            print "Finally" 
            if( self._lock.locked() ):
                print 'Locked!'
            print "Lock request ", self.getName()
            self._lock.acquire( )
            print "Got lock ", self.getName()
            index = self.progress.index( 0, 0, QtCore.QModelIndex())
            number = self.progress.itemData( index )
            self.progress.setData( index, QtCore.QVariant( (number[0].toInt()[0])+1 ) )
            self._lock.release()
            print "Release ", self.getName()
  

class guiForm(QtGui.QDialog, form_class):
    def __init__(self, *args):
        QtGui.QWidget.__init__(self, *args)
        self.sqlThreads = []
        self.caseModels = []
        self.querysNamesIndex = { 'Код 72':0, 'Test':1, 'dfdf':2 }
        self.garrisons = []
        self.caseModelIndex = 0
        self.setupUi(self)
        self.progressModel = QtGui.QStandardItemModel( 1,1 )
        self.progressModel.setData(self.progressModel.index(0, 0), QtCore.QVariant( 0 ) )
        self.queryModel = QtGui.QStandardItemModel( 0, len( self.querysNamesIndex )+1 )
        cols = self.queryModel.columnCount()-1
        for queryName, queryIndex in self.querysNamesIndex.items():
             self.queryModel.setHeaderData( queryIndex,
                                            QtCore.Qt.Horizontal,
                                            QtCore.QVariant( trUtf8( self, unicode(queryName, 'cp1251').encode( 'utf8' ) ) ) )
        self.inputQuery.setModel(self.queryModel)
        self.inputQuery.hideColumn(cols)
        self.connect(self.progressModel, QtCore.SIGNAL("dataChanged ( const QModelIndex &, const QModelIndex & )"), self.on_progressModel_dataChanged)
        self.addQuerys()

    def saveMainCheet(self):
        fileName = QtGui.QFileDialog.getSaveFileName(self, trUtf8( self,  unicode('Выберите имя файла для отчета', 'cp1251').encode( 'utf8' )) , "report.csv", self.tr("Comma Separated Values (*.csv);;All Files (*)") )
        if not fileName.isEmpty():
            report_fd = open( fileName, "wb" )
            d = csv.excel(  )
            d.quoting=0
            d.delimiter=';'
            report_writer = csv.writer( report_fd, d )
            rows = self.queryModel.rowCount()
            cols = self.queryModel.columnCount()-1
            record = []
            record.append ( "Гарнизоны" )
            for queryName, queryIndex in self.querysNamesIndex.items():
                record.append ( queryName )
            report_writer.writerow ( record )
            for row in range (rows):
                record = []
                record.append ( self.garrisons[row][1] )
                for col in range (cols):
                    index = self.queryModel.index( row, col, QtCore.QModelIndex())
                    number = self.queryModel.itemData( index )
                    record.append ( number[0].toInt()[0] )
                report_writer.writerow ( record )
            report_fd.close()

    def saveCases(self, garrisonIndex):
        fileName = QtGui.QFileDialog.getSaveFileName(self, trUtf8( self,  unicode('Выберите имя файла', 'cp1251').encode( 'utf8' )) , trUtf8( self, unicode(self.garrisons[garrisonIndex][1], 'cp1251').encode( 'utf8' )+".csv"), self.tr("Comma Separated Values (*.csv);;All Files (*)"))
        if not fileName.isEmpty():
            fn = QtCore.QString (fileName).toAscii()
            report_fd = open(fn, "wb" )
            d = csv.excel()
            d.quoting = 0
            d.delimiter = ';'
            report_writer = csv.writer( report_fd, d )
            caseModel = self.caseModels[self.caseModelIndex]
            rows = caseModel.rowCount()
            record = []
            record.append ( self.garrisons[garrisonIndex][1] )
            report_writer.writerow ( record )
            for row in range (rows):
                record = []
                index = caseModel.index( row, 0, QtCore.QModelIndex())
                number = caseModel.itemData( index )
                record.append ( number[0].toString() )
                report_writer.writerow ( record )
            report_fd.close()

    def on_progressModel_dataChanged(self, x):
        index = self.progressModel.index( 0, 0, QtCore.QModelIndex())
        number = self.progressModel.itemData( index )
        self.progress.setValue( self.progressModel.itemData( index )[0].toInt()[0]+1 )
        #print self.progress.value()
        if( self.progress.value()==self.progress.maximum() ):
            self.sqlThreads = []
            self.startQueryLoop.setEnabled( True )
            self.all2csv.setEnabled( True )
            self.progress.setEnabled( False )
            self.progress.setValue( 0 )
            print 'All querys done.'

    def on_inputQuery_clicked( self, x ):
        self.tableView.setModel( self.caseModels[ x.row() ] )
        self.caseModelIndex = x.row()

    def on_startQueryLoop_pressed(self):
         index = self.progressModel.index( 0, 0, QtCore.QModelIndex() )
         number = self.progressModel.itemData( index )
         self.progressModel.setData( index, QtCore.QVariant( 0 ) )
         self.progress.setEnabled( True )
         self.startQueryLoop.setEnabled( False )
         self.all2csv.setEnabled( False )
         self.progress.setMaximum ( ((len( self.querysNamesIndex ))*(len( self.garrisons )))*2 )
         progress_lock = threading.Lock()
         for queryName, queryIndex in self.querysNamesIndex.items():
              for garrisonIndex in range( len( self.garrisons ) ):
                    #print "Starting thread..."
                    if( progress_lock.locked() ):
                        print 'Locked!'
                    index = self.progressModel.index( 0, 0, QtCore.QModelIndex())
                    print "Main lock request"
                    progress_lock.acquire( )
                    print "Got lock"
                    number = self.progressModel.itemData( index )
                    self.progressModel.setData( index, QtCore.QVariant( (number[0].toInt()[0])+1 ) )
                    progress_lock.release()
                    print "Main release"
                    index = self.queryModel.index( garrisonIndex, queryIndex, QtCore.QModelIndex())
                    self.queryModel.setData( index, QtCore.QVariant( 'N/A' ) )
                    startDate = self.dateBox.date()
                    finiteDate = self.finiteDateBox.date()
                    query = ""
                    query = generateSqlString(
                                            self.garrisons[garrisonIndex][0],
                                            queryName,
                                            startDate.month(),
                                            startDate.year(),
                                            finiteDate.month(),
                                            finiteDate.year() )
                    newThread = sqlThread( "db", query, self.caseModels[ garrisonIndex ], self.queryModel, index, self.progressModel, progress_lock )
                    newThread.start()

    def on_all2csv_pressed(self):
        self.saveMainCheet()

    def on_cases2csv_pressed(self):
        self.saveCases( self.caseModelIndex )

    def addQuerys(self):
        csvgf = open( "garrisons.csv", "r" )
        all_garrisons = csv.DictReader(csvgf, fieldnames=['id', 'Name'])
        for garrison in all_garrisons:
             self.garrisons.append ( (garrison['id'], garrison['Name']) )
             rows = self.queryModel.rowCount()       
             self.queryModel.insertRow( rows )
             self.queryModel.setHeaderData( rows,
                                            QtCore.Qt.Vertical,
                                            QtCore.QVariant( trUtf8( self,  unicode(garrison['Name'], 'cp1251').encode( 'utf8' )) ) )
             currentModel = QtGui.QStandardItemModel( 0, 1 )
             currentModel.setHeaderData(0, QtCore.Qt.Horizontal, QtCore.QVariant( trUtf8( self,  unicode('Номер дела', 'cp1251').encode( 'utf8' )) ) )
             self.caseModels.append ( currentModel )            
        csvgf.close()
        self.tableView.setModel( self.caseModels[ 0 ] )
        self.caseModelIndex = 0

form = guiForm()
form.show()
app.exec_()


PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Разработка GUI | Следующая тема »


 




[ Время генерации скрипта: 0.1023 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.