Pierre Barbier de Reuille wrote: >nephish a écrit : > > >>Hello there ! >> >> > >Hello, > > > >>i am having a problem with threading. >>OK, i have this GUI app that i am building with pygtk. >>there is a process (four actually, just working on getting one right now) >>that needs to run in the background. >> >> > >Please, do not mix "process" and "threads" ... there very different ... >you're talking about threads here, so you want Threads to run in the >background ... > > > >>there is a button that starts the background function. But, it locks up >>the gui. it doesn't run in the background, it locks everything up. It >>still runs though. >> >> > >That's just normal ... if you read PyGtk documentation, you'll see you >need to initialise PyGtk to handle threads : > >http://www.async.com.br/faq/pygtk/index.py?req=index -> 20. The GTK >Mainloop and Threading > >http://www.async.com.br/faq/pygtk/index.py?req=show&file=faq20.006.htp >-> This is exactly your problem ! > >http://www.pygtk.org/pygtk2reference/gdk-functions.html#function-gdk--threads-init > >This is done like this : > ># First call to PyGtk function ever >gtk.gdk.threads_init() ># Here initialize what you want >[...] ># Launch the Gtk loop >gtk.gdk.threads_enter() # Unneeded if you don't want to call GUI > # functions from other threads >gtk.main() >gtk.gdk.threads_leave() # Needed only with threads_enter > > > >>one of the things this background process is to do is updata a viewable >>area on the GUI. Now when run from a terminal, when i hit CTRL+C >>it stops the thread, but doesnt kill the GUI, and the TextView gets >>updated right then with everything it should have gotten before. >> >> >>def Serial1(): >> print 'running serial 1' >> ser = serial.Serial('/dev/ttyS15', 2400, timeout=None) >> loopy = 1 >> i = 1 >> while loopy < 5: >> x_Now = strftime('%Y-%m-%d %H:%M:%S') >> i = i + 1 >> a = ser.read(1)#read one byte >> a = ord(a) # change byte to integer >> if (a < 64 )or (a > 127): >> continue >> b = ser.read(1) >> b = ord(b) >> if (b < 64 )or (b > 127): >> continue >> c = ser.read(1) >> c = ord(c) >> if c < 92: >> continue >> d = ser.read(1) >> d = ord(d) >> if d < 128: >> continue >> Sensor_ID = (a & 63) + (b & 63) * 64 + (c & 1) * 4096 >> Status = (c & 62) / 2 + (d & 63) * 32 >> c = int(c) >> d = int(d) >> x_Now = strftime('%Y-%m-%d %H:%M:%S') >> f = open('/home/piv/PivData/tmp/Serial/'+str(i), 'w') >> Input1Data = >>str(Sensor_ID)+'\t'+str(Status)+'\t--------->\t'+x_Now+'\n' >> Input1Iter = self.Input1Buffer.get_end_iter() >> self.Input1Buffer.insert(Input1Iter, >>Input1Data) >> >>f.write(str(Sensor_ID)+'\n'+str(c)+'\n'+str(d)+'\n'+str(Status)+'\n'+x_Now) >> >> >> f.close() >> thread.start_new(Serial1()) >> >>the code may not be best form, i am still fairly new at this. so i am >>also open to >>any constructive critisism. >> >>thanks >>shawn >>_______________________________________________ >>Tutor maillist - Tutor@python.org >>http://mail.python.org/mailman/listinfo/tutor >> >> >> > > > ok, i am still having a little problem understanding. tried it but i don't know if i have things set in the right order.
gtk.gdk.threads_init() # Here initialize what you want [...] # Launch the Gtk loop gtk.gdk.threads_enter() # Unneeded if you don't want to call GUI # functions from other threads gtk.main() gtk.gdk.threads_leave() # Needed only with threads_enter at the part where you wrote # Here initialize what you want [...] is that where i define the function that will run the thread? i get the part about having the enter and leave i just seem to have a hang up (so to speak) with where the function gets defined. do i need to build it as a class like the example in the link you sent? thanks for your help on this _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor