[Tutor] [tutor] threading problem in GUI
nephish
nephish at xit.net
Wed Sep 7 16:59:54 CEST 2005
nephish wrote:
> Serial1() just call the function ... it will be evaluated and then the
> result will be sent to Thread.start ...
>
> So try:
>
> Thread.start(Serial)
>
>
>ok,
>so far the thread runs fine in the background, but just does not send the output to the
>textbuffer, and hangs up the rest of the show.
>
>i think i am off in how i have the gtk.main() set up
>and how the main class is set up
>
>class SimpleGladeApp:
> def __init__(self, path, root=None, domain=None, **kwargs):
> if os.path.isfile(path):
> self.glade_path = path
> else:
> glade_dir = os.path.dirname( sys.argv[0] )
> self.glade_path = os.path.join(glade_dir, path)
> for key, value in kwargs.items():
> try:
> setattr(self, key, weakref.proxy(value) )
> except TypeError:
> setattr(self, key, value)
> self.glade = None
> self.install_custom_handler(self.custom_handler)
> self.glade = self.create_glade(self.glade_path, root, domain)
> if root:
> self.main_widget = self.get_widget(root)
> else:
> self.main_widget = None
> self.normalize_names()
> self.add_callbacks(self)
> self.new()
>
> def main(self):
> gtk.gdk.threads_enter()
> gtk.main()
> gtk.gdk.threads_leave()
>
>class Main(SimpleGladeApp):
> def __init__(self, path="pivcontrolcenter.glade",
> root="Main",
> domain=app_name, **kwargs):
> path = os.path.join(glade_dir, path)
> SimpleGladeApp.__init__(self, path, root, domain, **kwargs)
>
> def on_StartEnginesButton_clicked(self, widget, *args):
> print "on_StartEnginesButton_clicked called with self.%s" % widget.get_name()
> Input1Iter = self.Input1Buffer.get_end_iter()
> Input2Iter = self.Input2Buffer.get_end_iter()
> Input1Data = 'Reading Serial device ttyS14 \n'
> Input2Data = 'Reading Serial device ttys15 \n'
> self.Input1Buffer.insert(Input1Iter, Input1Data)
> self.Input2Buffer.insert(Input2Iter, Input2Data)
> time.sleep(1)
> def Serial1():
> print 'running serial 1'
> ser = serial.Serial('/dev/ttyS15', 2400, timeout=None)
> loopy = 1
> i = 1
> while loopy < 5:
> for x in range(5):
> i = i + 1
> a = ser.read(1)#read one byte
> a = ord(a) # change byte to integer
> if (a < 64 )or (a > 127):
> break
> b = ser.read(1)
> b = ord(b)
> if (b < 64 )or (b > 127):
> break
> c = ser.read(1)
> c = ord(c)
> if c < 92:
> break
> d = ser.read(1)
> d = ord(d)
> if d < 128:
> break
> 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')
> #gtk.threads_enter()
> Input1Data = str(Sensor_ID)+'\t'+str(Status)+'\t--------->\t'+x_Now+'\n'
> Input1Iter = self.Input1Buffer.get_end_iter()
> self.Input1Buffer.insert(Input1Iter, Input1Data)
> #gtk.threads_leave()
> f = open('/home/piv/PivData/tmp/Serial/'+str(i), 'w')
> f.write(str(Sensor_ID)+'\n'+str(c)+'\n'+str(d)+'\n'+str(Status)+'\n'+x_Now)
> f.close()
> Thread.start(Serial1())
>
>def main():
> main = Main()
> #gtk.threads_enter()
> main.run()
> #gtk.threads_leave()
>
>if __name__ == "__main__":
> #gtk.threads_enter()
> main()
> #gtk.threads_leave()
>
>lots of comments, been trying this several ways.
>
>cheers
>shawn
>
>
>
>
>
>_______________________________________________
>Tutor maillist - Tutor at python.org
>http://mail.python.org/mailman/listinfo/tutor
>
>
>
one more thing.
if i uncomment the lines
gtk.threads_enter()
and
gtk.threads_leave()
the whole thing locks up when the function is called.
the gui, and the thread both lock up.
thanks
More information about the Tutor
mailing list