gtk 线程笔记
Tofloor
poster avatar
z85525006
deepin
2012-09-10 07:46
Author
我作的笔记,下次好自己翻翻... .. 不要喷我.
因为本人要研究在线视频,要用到线程池等一些东西,所以就做点笔记什么的,大家不要以为是什么东西.
  1. #coding:utf-8
  2. import gtk
  3. import threading
  4. gtk.gdk.threads_init()
  5. class Test(object):
  6.     def __init__(self):
  7.         self.win = gtk.Window(gtk.WINDOW_TOPLEVEL)        
  8.         
  9.         self.btn = gtk.Button("按钮一")               
  10.         
  11.         self.win.add(self.btn)
  12.         
  13.         self.btn.connect("clicked", self.test_btn_clicked)
  14.         self.win.connect("destroy", lambda w : gtk.main_quit())
  15.         
  16.         self.win.show_all()
  17.         
  18.     def test_btn_clicked(self, widget):        
  19.         
  20.         threading_id = threading.Thread(target=self.test_print)
  21.         threading_id.setDaemon(True)
  22.         threading_id.start()
  23.         
  24.     def test_print(self):
  25.         i = 0
  26.         while True:            
  27.             # gtk.gdk.threads_enter()
  28.             self.btn.set_label(str(i))
  29.             # gtk.gdk.threads_leave()
  30.             i += 1
  31. Test()        
  32. gtk.main()
Copy the Code

MFC界面线程详解: http://zhou24388.blog.163.com/bl ... 327201172992145405/
http://www.cnblogs.com/yinh/archive/2005/05/25/162150.aspx
  1. #coding:utf-8
  2. import os
  3. import time
  4. import gtk
  5. import threading
  6. gtk.gdk.threads_init()
  7. class Test(object):
  8.     def __init__(self):
  9.         self.win = gtk.Window(gtk.WINDOW_TOPLEVEL)        
  10.         self.fixed = gtk.Fixed()
  11.         self.btn = gtk.Button("按钮一")               
  12.         self.btn2 = gtk.Button("按钮二")
  13.         self.btn3 = gtk.Button("按钮三")
  14.         self.btn.connect("clicked", self.test_button_clicked)
  15.         self.btn2.connect("clicked", self.test_button_clicked)
  16.         self.btn3.connect("clicked", self.test_button_clicked)
  17.         self.win.connect("destroy", lambda w : gtk.main_quit())
  18.         
  19.         self.fixed.put(self.btn, 20, 20)
  20.         self.fixed.put(self.btn2, 120, 20)
  21.         self.fixed.put(self.btn3, 500, 500)
  22.         self.win.add(self.fixed)
  23.         self.win.show_all()
  24.         
  25.     def test_button_clicked(self, widget):               
  26.         threading_id = threading.Thread(target=self.test_move_button, args=(widget,))
  27.         threading_id.setDaemon(True)
  28.         threading_id.start()        
  29.         
  30.     def test_move_button(self, button):
  31.         x = 0
  32.         y = 0
  33.         while True:
  34.             x += 5
  35.             if x > 200:
  36.                 x = 0
  37.                 y += 15                    
  38.             gtk.gdk.threads_enter()        
  39.             self.fixed.move(button, x, y)
  40.             gtk.gdk.threads_leave()
  41.             
  42.             time.sleep(0.1)
  43. Test()        
  44. gtk.main()
Copy the Code

线程中 队列 生产者 与 消费者队列的例子. 这个例子对于编写 线程池非常有帮助.
  1. #coding:utf-8
  2. from Queue import Queue
  3. import threading
  4. import random
  5. import time
  6. class Producer(threading.Thread):
  7.     def __init__(self, threadname, queue):
  8.         threading.Thread.__init__(self, name = threadname)
  9.         self.sharedata = queue
  10.         
  11.     def run(self):   
  12.         for i in range(20):
  13.             print self.getName(), i, "将值放入队列中:"
  14.             self.sharedata.put(i)
  15.         time.sleep(random.randrange(10)/10.0)
  16.         print self.getName(), '完成!!'
  17.         
  18. class Consumer(threading.Thread):        
  19.     def __init__(self, threadname, queue):
  20.         threading.Thread.__init__(self, name = threadname)
  21.         self.sharedata = queue
  22.         
  23.     def run(self):   
  24.         for i in range(20):
  25.             print self.getName(), '从队列中获取值:', self.sharedata.get()
  26.         time.sleep(random.randrange(10)/10.0)   
  27.         print self.getName(), '完成!!'
  28.         
  29. def main():        
  30.     queue = Queue()
  31.     producer = Producer('producer', queue)
  32.     consumer = Consumer('consumer', queue)
  33.    
  34.     print '线程开始...........'
  35.     producer.start()
  36.     consumer.start()
  37.    
  38.     producer.join()
  39.     consumer.join()
  40.    
  41.     print "所有线程执行完毕"
  42.    
  43. if __name__ == "__main__":   
  44.     main()
Copy the Code

扫描目录的线程的暂停和继续.
  1. #coding:utf-8
  2. import threading
  3. import time
  4. import os
  5. '''
  6. 这个例子是利用了  迭代器 的特点去扫描目录, 将递归尽量的分解了.
  7. 暂停和继续是使用了 event.
  8. '''
  9. event = threading.Event()
  10. def walk(path):
  11.     event.wait() # 暂停线程
  12.     try:
  13.         if os.path.isdir(path):
  14.             for file in os.listdir(path):
  15.                 file_path = os.path.join(path, file)
  16.                 for sub_file in walk(file_path):
  17.                     yield sub_file
  18.         else:
  19.             yield path
  20.     except:
  21.         print "read file error!!"
  22. def func():
  23.     for file in walk("/"):
  24.         print file
  25. def test():
  26.     th2 = threading.Thread(target=func)
  27.     th2.setDaemon(True) # 和GTK的主线程一起退出
  28.     th2.start()
  29. if __name__ == '__main__':
  30.     def btn_clicked(widget):
  31.         test()
  32.         print "start..."
  33.     def stop_btn_clicked(widget):
  34.         event.clear() # 暂停线程
  35.     def start_btn_clicked(widget):
  36.         event.set() # 开始线程
  37.     import gtk
  38.     # 初始化线程.
  39.     gtk.gdk.threads_init()
  40.    
  41.     win = gtk.Window(gtk.WINDOW_TOPLEVEL)     
  42.     btn = gtk.Button("初始化线程")   
  43.     stop_btn = gtk.Button("暂停扫描目录")   
  44.     start_btn = gtk.Button("开始扫描目录")   
  45.     hbox = gtk.HBox()   
  46.    
  47.     win.connect("destroy", lambda w : gtk.main_quit())
  48.     btn.connect("clicked", btn_clicked)
  49.     stop_btn.connect("clicked", stop_btn_clicked)
  50.     start_btn.connect("clicked", start_btn_clicked)
  51.    
  52.     hbox.pack_start(btn)
  53.     hbox.pack_start(start_btn)
  54.     hbox.pack_start(stop_btn)
  55.    
  56.     win.add(hbox)
  57.     win.show_all()
  58.    
  59.     gtk.gdk.threads_enter()
  60.     gtk.main()
  61.     gtk.gdk.threads_leave()
Copy the Code
Reply Favorite View the author
All Replies
ldmpscript
deepin
2012-12-24 02:48
#1
  1. ##########################################
  2. ## 线程扫描目录.  
  3. ## scan_dir = ScanDir('/home')
  4. ## scan_dir.connect("scan-file-event",self.scan..  ..
  5. ## def scan_file_event(scan_dir, file_name):...        
  6. class ScanDir(gobject.GObject):               
  7.     __gsignals__ = {
  8.         "scan-file-event" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
  9.                              (gobject.TYPE_STRING,)),
  10.         "scan-end-event" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
  11.                              ()),        
  12.         }            
  13.     def __init__(self, path):
  14.         gobject.GObject.__init__(self)
  15.         self.event = threading.Event()
  16.         self.path = path
  17.         self.__run()
  18.         
  19.     def pause(self): # 暂停线程
  20.         self.event.clear()
  21.         
  22.     def start(self): # 开启线程
  23.         self.event.set()
  24.         
  25.     def __wait(self):  
  26.         self.event.wait()
  27.         
  28.     def enter(self):   
  29.         gtk.gdk.threads_enter()
  30.         
  31.     def leave(self):   
  32.         gtk.gdk.threads_leave()        
  33.         
  34.     def __scan(self, path):
  35.         self.__wait()
  36.         try:
  37.             if os.path.isdir(path):
  38.                 for file_ in os.listdir(path):
  39.                     file_path = os.path.join(path, file_)
  40.                     for sub_file in self.__scan(file_path):
  41.                         yield sub_file
  42.             else:   
  43.                 yield path
  44.         except:
  45.             print "read file error!!"
  46.                     
  47.     def __run(self):
  48.         scan_th = threading.Thread(target=self.__run_func)
  49.         scan_th.setDaemon(True)
  50.         scan_th.start()
  51.         
  52.     def __run_func(self):   
  53.         for file_ in self.__scan(self.path):
  54.             self.emit("scan-file-event", file_)
  55.         self.emit("scan-end-event")   
  56.         
  57. if __name__ == "__main__":            
  58.     gtk.gdk.threads_init()   
  59.     def scan_file_event(scan_dir, file_name):
  60.         gtk.gdk.threads_enter()
  61.         label.set_label(file_name)
  62.         gtk.gdk.threads_leave()
  63.         
  64.     def scan_end_event(scan_dir):   
  65.         gtk.gdk.threads_enter()
  66.         label.set_label("%s扫描完毕"%(scan_dir.path))
  67.         gtk.gdk.threads_leave()        
  68.         
  69.     def start_btn_clicked(widget):   
  70.         scan_dir.start()
  71.         
  72.     def pause_btn_clicked(widget):   
  73.         scan_dir.pause()
  74.         
  75.     scan_dir = ScanDir("/")
  76.     scan_dir.connect("scan-file-event", scan_file_event)               
  77.     scan_dir.connect("scan-end-event", scan_end_event)
  78.     win = gtk.Window(gtk.WINDOW_TOPLEVEL)
  79.     win.set_title("线程测试!!")
  80.     vbox = gtk.VBox()
  81.     hbox = gtk.HBox()
  82.     start_btn=gtk.Button("开始")
  83.     pause_btn=gtk.Button("暂停")   
  84.     hbox.pack_start(start_btn, False, False)
  85.     hbox.pack_start(pause_btn, False, False)
  86.     label = gtk.Label("...")   
  87.     vbox.pack_start(hbox, False, False)
  88.     vbox.pack_start(label, False, False)
  89.     win.add(vbox)   
  90.     win.connect("destroy", lambda w : gtk.main_quit())   
  91.     start_btn.connect("clicked", start_btn_clicked)
  92.     pause_btn.connect("clicked", pause_btn_clicked)
  93.     win.show_all()
  94.    
  95.     gtk.gdk.threads_enter()
  96.     gtk.main()
  97.     gtk.gdk.threads_leave()
Copy the Code
Reply View the author