Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.32 KB | None | 0 0
  1. from PyQt5 import QtWidgets as QtW
  2. from PyQt5 import QtCore as QtC
  3. import threading as th
  4. import numpy as np
  5. import sys
  6.  
  7.  
  8. class MainWindow(QtW.QMainWindow):
  9.     def __init__(self):
  10.         self.monitor = th.Condition()
  11.         super().__init__()
  12.         self.threads = []
  13.         self.elements_num = 19629687
  14.         self.array = np.random.random_integers(-20000000, 20000000, self.elements_num)
  15.         self.min_element = self.array[0]
  16.         self.number_of_threads_to_create_label = QtW.QLabel(self)
  17.         self.number_of_threads_to_create_box = QtW.QComboBox(self)
  18.         self.create_threads_button = QtW.QPushButton('Create threads', self)
  19.         self.threads_table = QtW.QTableWidget(self)
  20.        
  21.  
  22.  
  23.         self.progress_bar = QtW.QProgressBar(self)
  24.         self.use_sync = QtW.QCheckBox(self)
  25.         self.use_sync.setGeometry(10, 160, 100, 14)
  26.         self.use_sync.setText("Monitor")
  27.         self.use_sync_wait = QtW.QCheckBox(self)
  28.         self.use_sync_wait.setGeometry(10, 170, 100, 14)
  29.         self.use_sync_wait.setText("Timer")
  30.         self.widget_settings()
  31.         self.show()
  32.  
  33.         self.timer = QtC.QTimer(self)
  34.         self.timer.setInterval(250)
  35.         self.timer.timeout.connect(self.update_table)
  36.         self.timer.start()
  37.  
  38.    
  39.    
  40.  
  41.     def widget_settings(self):
  42.         self.setFixedSize(700, 190)
  43.         self.setGeometry(150, 70, 700, 190)
  44.         self.setWindowTitle('Lab10')
  45.  
  46.         self.number_of_threads_to_create_label.setText("<h2 align='right'>Number:</h2>")
  47.         self.number_of_threads_to_create_label.setGeometry(5, 10, 94, 30)
  48.  
  49.         self.number_of_threads_to_create_box.setGeometry(100, 10, 32, 30)
  50.         self.number_of_threads_to_create_box.addItems(['1', '2', '4', '8'])
  51.  
  52.         self.create_threads_button.setGeometry(4, 40, 130, 30)
  53.         self.create_threads_button.clicked.connect(self.create_threads)
  54.  
  55.         self.progress_bar.setGeometry(150, 152, 540, 30)
  56.         self.progress_bar.setMinimum(0)
  57.         self.progress_bar.setMaximum(self.elements_num)
  58.         self.progress_bar.setAlignment(QtC.Qt.AlignCenter)
  59.  
  60.         self.threads_table.setColumnCount(3)
  61.         self.threads_table.setSelectionBehavior(QtW.QAbstractItemView.SelectRows)
  62.         self.threads_table.setSelectionMode(QtW.QAbstractItemView.SingleSelection)
  63.         self.threads_table.setHorizontalHeaderLabels(['Name', 'Min Element', 'Progress'])
  64.         self.threads_table.setGeometry(150, 10, 540, 134)
  65.         self.threads_table.setFixedSize(540, 134)
  66.         self.threads_table.horizontalHeader().setStretchLastSection(True)
  67.         self.threads_table.verticalHeader().setDefaultSectionSize(20)
  68.         self.threads_table.setColumnWidth(0, 50)
  69.         for i in range(8):
  70.             self.threads_table.setRowHeight(i, 20)
  71.  
  72.     def create_threads(self):
  73.         self.create_threads_button.setDisabled(True)
  74.         self.threads.clear()
  75.         t_num = 2 ** self.number_of_threads_to_create_box.currentIndex()
  76.  
  77.         func = self.find_minimal
  78.  
  79.         if self.use_sync.isChecked():
  80.             func = self.find_minimal_sync
  81.  
  82.         for i in range(t_num):
  83.             left = len(self.array)//t_num*i
  84.             if i == t_num -1:
  85.                 right = len(self.array)
  86.             else:
  87.                 right = len(self.array)//t_num*(i+1)
  88.  
  89.             self.threads.append([th.Thread(target=func,
  90.                                            args=(left, right, i),
  91.                                            name="Thread "+str(i))])
  92.             self.threads[-1].append([0, right-left])
  93.             self.threads[-1].append(self.array[left])
  94.             self.threads[-1][0].start()
  95.  
  96.         if self.use_sync_wait.isChecked():
  97.             self.progress_bar.setValue(0)
  98.             self.progress_bar.setEnabled(True)
  99.             wait = th.Thread(target=self.update_progress, daemon=True)
  100.             wait.start()
  101.         else:
  102.             self.progress_bar.setDisabled(True)
  103.  
  104.     def update_progress(self):
  105.         if len(self.threads) and self.progress_bar.value() < self.elements_num:
  106.             self.progress_bar.setValue(sum([x[1][0] for x in self.threads]))
  107.             timer = th.Timer(0.5, self.update_progress)
  108.             timer.setDaemon(True)
  109.             timer.start()
  110.  
  111.  
  112.     def update_table(self):
  113.         try:
  114.             selected_thread = 0
  115.             if self.threads and self.threads_table.selectedIndexes():
  116.                 selected_thread = self.threads[self.threads_table.selectionModel().selectedRows()[0].row()]
  117.  
  118.             done = 1
  119.             for i in self.threads:
  120.                 if len(i) == 3:
  121.                     done = 0
  122.             if done:
  123.                 self.create_threads_button.setDisabled(False)
  124.  
  125.             self.threads_table.setRowCount(0)
  126.             for j, i in enumerate(self.threads):
  127.                 self.threads_table.insertRow(j)
  128.                 row = [QtW.QTableWidgetItem(x) for x in [
  129.                     i[0].getName(),
  130.                     str(i[2]),
  131.                     str(i[1][0]) + '/' + str(i[1][1]),
  132.                     ]
  133.                 ]
  134.  
  135.                 for k in row:
  136.                     k.setFlags(QtC.Qt.ItemIsEnabled | QtC.Qt.ItemIsSelectable)
  137.                 self.threads_table.setItem(j, 0, row[0])
  138.                 self.threads_table.setItem(j, 1, row[1])
  139.                 self.threads_table.setItem(j, 2, row[2])
  140.  
  141.             if selected_thread in self.threads:
  142.                 self.threads_table.selectRow(self.threads.index(selected_thread))
  143.  
  144.         except:
  145.             pass
  146.  
  147.     def find_minimal(self, left_border, right_border, num):
  148.         self.threads[num][2] = self.array[left_border]
  149.         for i in range(left_border, right_border):
  150.             self.threads[num][1][0] += 1
  151.             if self.array[i] < self.threads[num][2]:
  152.                 self.threads[num][2] = self.array[i]
  153.         self.threads[num].append("Done")
  154.  
  155.     def find_minimal_sync(self, left_border, right_border, num):
  156.         self.threads[num][2] = self.array[left_border]
  157.         for i in range(left_border, right_border):
  158.             self.threads[num][1][0] += 1
  159.  
  160.             if self.array[i] < self.threads[num][2]:
  161.                 self.threads[num][2] = self.array[i]
  162.         self.threads[num].append("Done")
  163.  
  164.  
  165. if __name__ == '__main__':
  166.     app = QtW.QApplication(sys.argv)
  167.     window = MainWindow()
  168.     sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement