20/05/10 15:48
arty.net
Ho un problema con questo codice :
Codice:
E' la semplice stampa di un ciclo while su un secono frame chiamato Risultati, comandato dal frame principale. Premendo il tasto Calculate si avvia il ciclo e viene stampato sul TextCtrl del frame Risultati. Voglio inoltre che per il ciclo venga usato un altro thread rispetto a quello principale del programma. Ottengo molto spesso (nel 50% dei casi ) gli errori
oppure
come devo fare per evitare gli errori ? Non li fa sempre ma è proprio questo che devo risolvere, specialmente per innestare in seguito del codice + complesso....Girovagando in giro su internet ho visto che probabilmente è dovuto al fatto che sia il ciclo che l'AppendText sul frame Risultati sono governtati dallo stesso thread ( nuovo, che creo con la classe thread).
daniweb.com/forums/…
E' possibile ? Esiste un modo per risolverlo ? grz in anticipo
Codice:
#!/usr/bin/env python # -*- coding: utf8 -*- import random import wx import os # Operating System dependent call import sys import cPickle as p import csv import thread # Define dialog component ID_EXIT = 98 ID_CALCULATE = 99 ID_PLOT = 100 ID_CLOSE = 101 ID_CLEAR_TERM = 102 ID_RESET = 103 ID_CALCULATE_SINGLE = 104 def formatta(valore): tmp = str("%.1f" % valore) if tmp == "-0.0": return tmp.replace("-","") else: return tmp class MainWindow(wx.Frame): def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, wx.ID_ANY, title, size=(600, 600),pos = (200,100)) #Creates a menu filemenu1=wx.Menu() filemenu1.AppendSeparator() filemenu1.Append(ID_EXIT, "&Exit", "Terminate the program") # Creating the menubar menuBar=wx.MenuBar() menuBar.Append(filemenu1, "&File") #Adding the filemenu to the MenuBar self.SetMenuBar(menuBar) #Adding the MenuBar to the Frame content #self.control = wx.TextCtrl(self, 1, style=wx.TE_MULTILINE) self.CreateStatusBar() # A statusbar in the bottom of the window mod = ['B-ASK','4-ASK','8-ASK','BPSK','Q-PSK','8-PSK','Sunde FSK','QAM-16','QAM-64','QAM-256'] incr = ['1.0', '0.5', '0.2','0.1'] wx.StaticText(self, -1, "Scegliere la modulazione :",(50,30)) self.combo1 = wx.ComboBox(self, -1, pos=(50, 70), size=(150, -1), choices=mod, value='B-ASK', style=wx.CB_READONLY) wx.StaticText(self, -1, "Scegliere i valori minimo e massimo di Eb/N0 (db):",(50,120)) wx.StaticText(self, -1, "Minimo :",(50,175)) wx.StaticText(self, -1, "Massimo :",(210,175)) self.txt1 = wx.TextCtrl(self, -1, '0',(120,170)) self.txt2 = wx.TextCtrl(self, -1, '10',(290,170)) wx.StaticText(self, -1, "Scegliere l'incremento :",(50,240)) self.combo2 = wx.ComboBox(self, -1, pos=(50, 280), size=(150, -1), choices=incr, value='1.0', style=wx.CB_READONLY) #wx.Button(self, ID_CLOSE, 'Close', (500, 540)) self.btn1 = wx.Button(self, ID_CALCULATE, 'Calculate', (50, 340)) self.btn2 = wx.Button(self, ID_PLOT, 'Plot', (150, 340)) self.btn3 = wx.Button(self, ID_RESET, 'Reset', (250, 340)) self.btn4 = wx.Button(self, ID_CLEAR_TERM, 'Clear Terminal', (350, 340)) wx.StaticText(self, -1, "CALCOLO DI UN SOLO VALORE DEL BER :",(50,400)) wx.StaticText(self, -1, "Inserire il valore di Eb/N0 (db) :",(50,430)) wx.StaticText(self, -1, "Eb/N0 (db) :",(50,475)) self.txt3 = wx.TextCtrl(self, -1, '0',(150,470)) self.btn5 = wx.Button(self, ID_CALCULATE_SINGLE, 'Calculate single', (250, 465)) #self.rb2 = wx.RadioButton(self, -1, 'Off', (400, 395), style=wx.RB_GROUP) #self.rb1 = wx.RadioButton(self, -1, 'On', (350, 395),) #self.Bind(wx.EVT_RADIOBUTTON, self.disable_all, id=self.rb1.GetId()) #self.Bind(wx.EVT_RADIOBUTTON, self.enable_all, id=self.rb2.GetId()) wx.EVT_MENU(self, ID_EXIT, self.OnClose) wx.EVT_BUTTON(self, ID_CALCULATE, self.miothread1) #wx.EVT_BUTTON(self, ID_PLOT, self.miothread2) wx.EVT_BUTTON(self, ID_RESET, self.reset) wx.EVT_BUTTON(self, ID_CLEAR_TERM, self.clear_term) #wx.EVT_BUTTON(self, ID_CALCULATE_SINGLE, self.miothread3) self.enable_all(True) self.frame2 = Risultati(None,-1,"Risultati") self.frame2.Show(True) def disable_all(self,e): self.combo1.Disable() self.combo2.Enable() self.txt1.Enable() self.txt2.Enable() self.btn1.Disable() self.btn2.Disable() #self.btn3.Disable() #self.btn4.Disable() self.txt3.Enable() self.btn5.Enable() def enable_all(self,e): self.combo1.Disable() self.combo2.Enable() self.txt1.Enable() self.txt2.Enable() self.btn1.Enable() self.btn2.Disable() self.btn3.Enable() #self.btn4.Enable() self.txt3.Disable() self.btn5.Disable() def OnClose(self, e): self.Close(True) self.frame2.Close(True) #def calcolo(self,objMod,DeMod,titolo,minimum,maximum,incremento): def calcolo(self,e): i = minimum = float(self.txt1.GetValue()) maximum = float(self.txt2.GetValue()) incremento = float(self.combo2.GetValue()) print 'min value = '+str(float(minimum)) print 'max value = '+str(float(maximum)) print 'increase = '+str(incremento) print '---------------Results---------------' self.frame2.log.AppendText('min value = '+str(float(minimum))+'\n'+'max value = '+str(float(maximum))+'\n'+'increase = '+str(incremento)+'\n'+'---------------Results---------------\n') while True: if i <= maximum: self.frame2.LogMessage2(formatta(i)) print i i += incremento else: break #print 'Ber calculation done !' #self.frame2.LogMessage_single('Ber calculation done !') #self.frame2.log.AppendText('Ber caculation done !') def clear_term(self,e): cmd = 'clear' os.system(cmd) self.frame2.log.Clear() def reset(self,e): os.system('rm ./sys/incremento.csv') os.system('rm ./sys/titolo.csv') os.system('rm ./risultati.csv') os.system('rm ./db.csv') #os.system('rm ./risultati.txt') #os.system('rm ./db.txt') def miothread1(self,e): thread.start_new_thread(self.calcolo, (0,)) class Risultati(wx.Frame): def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, id, title) panel = wx.Panel(self) self.log = wx.TextCtrl(panel, -1, "",style=wx.TE_MULTILINE) self.log.SetEditable(False) box = wx.BoxSizer(wx.VERTICAL) box.Add(self.log, 1, wx.EXPAND|wx.ALL, 5) #self.SetSizer(box) panel.SetSizer(box) def LogMessage(self, msg1, msg2): self.log.AppendText(msg1+' : '+msg2+'\n') def LogMessage2(self, msg1): self.log.AppendText(msg1+'\n') #class MyApp(wx.App): #def OnInit(self): #frame=MainWindow(None, -1, "BER Tool AWGN") #frame.Show(True) ##frame2 = Risultati(None,-1,"Risultati") ##frame2.Show(True) #self.SetTopWindow(frame) #return True app = wx.App() frame=MainWindow(None, -1, "BER Tool AWGN") frame.Show(True) app.MainLoop()
E' la semplice stampa di un ciclo while su un secono frame chiamato Risultati, comandato dal frame principale. Premendo il tasto Calculate si avvia il ciclo e viene stampato sul TextCtrl del frame Risultati. Voglio inoltre che per il ciclo venga usato un altro thread rispetto a quello principale del programma. Ottengo molto spesso (nel 50% dei casi ) gli errori
Segmentation Fault
oppure
(python:11242): Gtk-CRITICAL **: gtk_text_layout_wrap_loop_start: assertion `layout->one_style_cache == NULL' failed (python:11242): Gtk-CRITICAL **: gtk_text_layout_wrap_loop_end: assertion `layout->wrap_loop_count > 0' failed
come devo fare per evitare gli errori ? Non li fa sempre ma è proprio questo che devo risolvere, specialmente per innestare in seguito del codice + complesso....Girovagando in giro su internet ho visto che probabilmente è dovuto al fatto che sia il ciclo che l'AppendText sul frame Risultati sono governtati dallo stesso thread ( nuovo, che creo con la classe thread).
daniweb.com/forums/…
E' possibile ? Esiste un modo per risolverlo ? grz in anticipo
aaa