-
Notifications
You must be signed in to change notification settings - Fork 0
/
prime_gui.py
133 lines (95 loc) · 3.35 KB
/
prime_gui.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/python
import threading
from time import sleep
import printrewritable as pr
import prime
import itertools
OUTPUT_FILE = 'primelist.txt'
polling_time = 0.042
def thread_name(action):
action = str(action)
return '%s thread %r.' % (action, threading.current_thread().name)
prw = pr.PrintRewritable()
class PrimeGUI():
def __init__(self, *args):
self._helper_threads = ()
self.reset(*args)
def _setup_threads(self):
prime_thread = threading.Thread(target=self._prime_finder)
prime_thread.setName('PrimeThread')
display_thread = threading.Thread(target=self._display_thread)
display_thread.setName('CheckerThread')
self._helper_threads = (prime_thread, display_thread)
def reset(self):
self.stop()
self._pc = prime.PrimeCollection()
def start(self):
self.stop()
self._setup_threads()
self._queuing_finished = False
for t in self._helper_threads:
if not t.is_alive():
t.start()
def stop(self):
self._queuing_finished = True
for t in self._helper_threads:
if t.is_alive():
t.join()
def save(self, filepath):
self.stop()
self._save_enumeration_to_file(filepath, *self._pc.cache)
def load(self, filepath):
self.stop()
data = self._load_enumeration_from_file(filepath)
self._pc = prime.PrimeCollection(data)
def _last_prime(self):
return self._pc.last
last_prime = property(_last_prime)
def is_continuing(self, *a):
return not self._queuing_finished
def _prime_finder(self):
for prime_num in itertools.takewhile(self.is_continuing, self._pc):
pass
def _display_thread(self):
'''Check queue for messages, if queue has something in it,
will check it again and again until it does not as which point:
it will wait for a bit and try again.
'''
while self.is_continuing():
prw.print(self.last_prime, True)
# So it does not use excessive CPU.
sleep(polling_time)
def __len__(self):
return len(self._pc)
def _save_enumeration_to_file(self, filepath, *output_enumeration):
with open(filepath, mode='w') as f:
for item in output_enumeration:
f.write('%s\n' % item)
def _load_enumeration_from_file(self, filepath):
with open(filepath, mode='r') as f:
stripped_lines = (line.strip() for line in f.readlines())
# if statement makes it so blank lines are ignored
return (int(line) for line in stripped_lines if line)
if __name__ == "__main__":
print('Prime number finder:')
prw.print('Loading...', True)
p = PrimeGUI()
try:
p.load(OUTPUT_FILE)
except IOError:
print('No data found, starting from stratch.')
# Have to be separate because of the printrewritable functionality
print('Hit Enter to finish and save.')
p.start()
input()
p.stop()
print()
print('%d highest prime' % (p.last_prime))
print('%d found' % (len(p)))
print('Attempting to save file to %r, this may take a while.' % (OUTPUT_FILE))
try:
p.save(OUTPUT_FILE)
except IOError:
print('File failed to save.')
else:
print('File saved successfully.')