möchte ich das Ganze nochmal aufgreifen.
Das folgende Programm erzeugt eine grössere Anzahl
von Threads und kommuniziert mit der Gui mittels
eines Message-Queues.
Code: Alles auswählen
#!/usr/bin/env python
####
import Tkinter as tk
import threading
import Queue as qu
import random as rand
import time as ti
import sys
####
class Gui(object):
def __init__(self, root, controller):
self.root = root
self.queue = controller.queue
self.controller = controller
self.text = tk.Text(root)
self.text.pack(expand=tk.YES, fill=tk.BOTH)
root.protocol("WM_DELETE_WINDOW", self.quit)
self.button = tk.Button(text='Stop',
command=self.controller.set_stop)
self.button.pack()
self.button = tk.Button(text='Quit', command=self.quit)
self.button.pack()
def quit(self):
self.controller.set_stop()
self.root.destroy()
sys.exit(0)
def write(self, txt):
self.text.insert(tk.END, txt + '\n')
self.text.see(tk.END)
def process(self):
while self.queue.qsize():
try:
msg = self.queue.get()
self.queue.task_done()
self.write(str(msg))
self.root.update_idletasks()
except qu.Empty:
pass
self.root.after(1, self.process)
####
class Threader(object):
def __init__(self, root, n, sleeptime=0.5):
self.root = root
self.queue = qu.Queue(maxsize=1000)
self.gui = Gui(root, self)
self.set_running()
self.threads = [None] * n
for i in xrange(n):
self.threads[i] = threading.Thread(target=self.worker,
args=(i, sleeptime))
self.threads[i].setDaemon(1)
self.threads[i].start()
self.set_running()
def set_running(self):
self.running = 1
self.gui.process()
def set_stop(self):
self.running = 0
def worker(self, i, sleeptime):
while self.running:
t = rand.random() * sleeptime
ti.sleep(t)
if self.running:
msg = 'thread: %3d - slept: %s - queue size: %s' % \
(i, str(t), self.queue.qsize())
self.queue.put(msg)
self.queue.join()
####
def main_threader():
# zum rumspielen
MAX_THREADS = 380
SLEEPTIME = 0.4
root = tk.Tk()
root.title('Queue Polling')
Threader(root, MAX_THREADS, SLEEPTIME)
root.mainloop()
####
if __name__ == '__main__':
main_threader()
####

yipyip