Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,316

    [Python 2.7] Problema Multi-threading

    Ho solo programmato web fino ad oggi perciò sto faticando molto ad utilizzare e capire il concetto di threading.


    codice:
    #!/usr/bin/env python
    
    
    """
    People's Poker Heads-Up SNG HUD
    
    
    @Author: Tomas Bartoli <***@gmail.com>
    @Date: 29/12/2016
    @License: Copyright (C) 2016-2017
    
    
    This software is not open source
    """
    
    
    # Import general libraries used in the application
    import os, sys, re, threading, time
    
    
    # Import GUI libraries
    import pygtk 
    pygtk.require('2.0') 
    import gtk
    
    
    """
    
    
    """
    class HUDCore(object):
    
    
    	__rootPath = None
    	__dataPath = None
    	__libPath  = None
    	
    	__config   = {}
    	
    	__dbOBj = None
    
    
    
    
    	"""
    	
    	"""
    	def __init__(self):
    		self.__initEnvironment()
    		self.__initDatabase()
    		self.__initInterface()
    	# End __init__
    	
    	"""
    	 " Set environment data
    	 "
    	 " @method	private
    	 " @return void
    	"""
    	def __initEnvironment(self):
    		self.__rootPath = sys.path[0] + os.sep
    		self.__dataPath = sys.path[0] + os.sep + 'data' + os.sep
    		self.__libPath  = sys.path[0] + os.sep + 'libraries' + os.sep
    
    
    		os.chdir(self.__libPath)
    		sys.path.append(self.__libPath)
    	# End __initEnvironment
    	
    	"""
    	 " Connection and selection at the database
    	 "
    	 " @see		librariesdatabase.py
    	 " @method	private
    	 " @return	void
    	"""
    	def __initDatabase(self):
    		file = open(self.__dataPath + 'config.ini', 'r')
    		while True:
    			line = file.readline()
    			if line == '':
    				break
    			search = re.findall('([A-Z]{4})s=s"(.*?)"', line)
    			self.__config[search[0][0]] = search[0][1]
    
    
    		file.close()
    
    
    		import database
    		self.__dbOBj = database
    		
    		self.__dbOBj.db(self.__config['HOST'], 
    				self.__config['USER'], 
    				self.__config['PASS'], 
    				self.__config['NAME'])
    	# End __initDatabase
    	
    	"""
    	 " Print GUI window  
    	"""
    	def __initInterface(self):
    		self.window = gtk.Window(type = gtk.WINDOW_TOPLEVEL)
      
    		self.window.set_position(gtk.WIN_POS_CENTER)
    		self.window.connect('delete_event', self.deleteEvent)
    		self.window.connect('destroy', self.destroy)
    		self.window.set_title('People's Poker Heads-Up SNG HUD')
    		self.window.set_size_request(200, 50)  
    		self.window.set_resizable(False)
    
    
    		hbox = gtk.HBox(True, 10)
    		hbox.set_border_width(10)
    		self.window.add(hbox)
    		hbox.show()
    
    
    		self.BTNImport = gtk.Button('Start Import')
    		hbox.pack_start(self.BTNImport, True, True, 0)
    		self.BTNImport.connect('clicked', self.clickImport)
    		self.BTNImport.show()
    	# End __initInterface
    	
    	"""
    	 " @see \__initInterface()
    	 "
    	 " @method	private
    	 "
    	 " @param	widget
    	 " @param	event
    	 " @param	data
    	 "
    	 " @return	bool	False
    	"""
    	def deleteEvent(self, widget, event, data = None):
    		return False
    	# End deleteEvent
    	
    	"""
    	 " @see \__initInterface()
    	 "
    	 " @method	private
    	 "
    	 " @param	widget
    	 " @param	data
    	 "
    	 " @return	bool	False
    	"""
    	def destroy(self, widget, data = None):
    		self.__dbOBj.close()
    		self.window.destroy()
    		gtk.main_quit()
    	# End destroy
    
    
    	"""
    	
    	"""
    	def clickImport(self, widget, data = None):
    		if self.BTNImport.get_label() == 'Start Import':
    			self.BTNImport.set_label('Stop Import')
    			
    			var = threading.Thread(target=self.tryThread)
    			var.setDaemon(True)
    			var.start()
    			
    		else:
    			self.BTNImport.set_label('Start Import')
    	# End destroy
    	
    	def tryThread(self):
    		i = 0
    		while True:
    			print str(i)
    			i = i + 1
    			time.sleep(5)
    
    
    	
    	"""
    	
    	"""
    	def main(self):  
    		self.window.show()  
    		gtk.main()
    		exit
    	# End main
    # End class HUDCore
    
    
    if __name__== '__main__':
    	init = HUDCore()
    	init.main()

    Se provate ad eseguire il codice ci sarà un bottone con scritto "Start Import", cliccandoci sopra vorrei venisse eseguita questa porzione di codice:
    codice:
    			var = threading.Thread(target=self.tryThread)
    			var.setDaemon(True)
    			var.start()
    # [...]
    
    
    	def tryThread(self):
    		i = 0
    		while True:
    			print str(i)
    			i = i + 1
    			time.sleep(5)

    e quindi cominciasse a stamparmi in loop dei numeri crescenti ogni 5 secondi, senza però condizionare il funzionamento del programma, non mi stupisce che non funziona, il ciclo viene avviato solo quando chiudo la GUI, perchè?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,316
    Grazie alla segnalazione di un utente di un noto forum di linux ho risolto, per correttezza posto il suo commento:


    telperion scrive:


    Non è un problema di python
    sono le gtk (e anche le altre lib grafiche) che sono un pain in the ass.


    Con le gtk3 la soluzione è questa:
    https://wiki.gnome.org/Projects/PyGObject/Threading


    con le vecchie gtk2 (pygtk ) non saprei devi cercare

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.