编写一多线程程序,实现如下功能: (1)一个线程随机产生 100-5000 之间的整数,并计算所有已产生整数的 累加和,每次产生随机整数的时间随机间隔 100- 1000 毫秒; (2)另一个线程每隔 1 秒时间读取上个线程的计算等式和运算结果,并 在图形界面中实时显示。
时间: 2024-03-21 22:43:19 浏览: 61
好的,以下是一个简单的实现:
```python
import threading
import random
import time
import tkinter as tk
class RandomNumberThread(threading.Thread):
def __init__(self, sum_lock, data_lock, data, sum_value):
super().__init__()
self.sum_lock = sum_lock
self.data_lock = data_lock
self.data = data
self.sum_value = sum_value
self.stop_event = threading.Event()
def run(self):
while not self.stop_event.is_set():
random_int = random.randint(100, 5000)
with self.sum_lock:
self.sum_value += random_int
with self.data_lock:
self.data.append((random_int, self.sum_value))
time.sleep(random.uniform(0.1, 1))
def stop(self):
self.stop_event.set()
class DisplayThread(threading.Thread):
def __init__(self, data_lock, data, label):
super().__init__()
self.data_lock = data_lock
self.data = data
self.label = label
self.stop_event = threading.Event()
def run(self):
while not self.stop_event.is_set():
with self.data_lock:
if self.data:
data = self.data.pop(0)
self.label.config(text=f"{data[0]} + {data[1]} = {data[0] + data[1]}")
time.sleep(1)
def stop(self):
self.stop_event.set()
def main():
sum_lock = threading.Lock()
data_lock = threading.Lock()
data = []
sum_value = 0
root = tk.Tk()
root.title("Random Number Display")
label = tk.Label(root, text="Waiting for data...")
label.pack()
random_thread = RandomNumberThread(sum_lock, data_lock, data, sum_value)
display_thread = DisplayThread(data_lock, data, label)
random_thread.start()
display_thread.start()
root.protocol("WM_DELETE_WINDOW", lambda: stop_threads(random_thread, display_thread, root))
root.mainloop()
def stop_threads(*threads, root):
for thread in threads:
thread.stop()
root.destroy()
if __name__ == "__main__":
main()
```
这个程序有两个线程,一个是随机数产生线程 `RandomNumberThread`,一个是显示线程 `DisplayThread`。`RandomNumberThread` 会在随机的时间间隔内产生一个随机整数,并将它加入累加和中,然后将这个整数和当前累加和作为一组数据加入一个列表中。`DisplayThread` 则每秒钟从这个列表中取出一组数据,并显示在图形界面中。
注意到这个程序中,我们使用了 `threading.Lock` 来保护共享数据的访问。这是必要的,因为两个线程会同时访问 `data` 和 `sum_value`。我们还使用了 `threading.Event` 来实现线程的停止。当我们想要停止线程时,可以调用线程的 `stop` 方法,这会设置一个事件,使得线程在下一次循环时退出。
最后,我们在主程序中创建了两个线程,并调用它们的 `start` 方法来启动线程。我们还创建了一个图形界面,用来显示数据。当我们关闭这个界面时,我们会调用 `stop_threads` 函数来停止两个线程,并销毁界面。
阅读全文