Advertisement
Guest User

Untitled

a guest
Apr 30th, 2025
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.58 KB | None | 0 0
  1. import sys
  2. import psutil
  3. import os
  4. import logging
  5. from PyQt5.QtWidgets import (
  6. QApplication, QMainWindow, QVBoxLayout, QWidget, QLabel,
  7. QPushButton, QHBoxLayout, QTableWidget, QTableWidgetItem,
  8. QHeaderView, QFrame
  9. )
  10. from PyQt5.QtCore import QTimer, Qt
  11. from PyQt5.QtGui import QFont, QPalette, QColor, QIcon
  12.  
  13. # Настройка логирования
  14. logging.basicConfig(
  15. filename="resource_allocator.log",
  16. level=logging.ERROR,
  17. format="%(asctime)s - %(levelname)s - %(message)s",
  18. )
  19.  
  20. class DarkTheme:
  21. @staticmethod
  22. def setup(app):
  23. palette = QPalette()
  24. palette.setColor(QPalette.Window, QColor(53, 53, 53))
  25. palette.setColor(QPalette.WindowText, Qt.white)
  26. palette.setColor(QPalette.Base, QColor(35, 35, 35))
  27. palette.setColor(QPalette.AlternateBase, QColor(53, 53, 53))
  28. palette.setColor(QPalette.ToolTipBase, Qt.white)
  29. palette.setColor(QPalette.ToolTipText, Qt.white)
  30. palette.setColor(QPalette.Text, Qt.white)
  31. palette.setColor(QPalette.Button, QColor(53, 53, 53))
  32. palette.setColor(QPalette.ButtonText, Qt.white)
  33. palette.setColor(QPalette.BrightText, Qt.red)
  34. palette.setColor(QPalette.Highlight, QColor(42, 130, 218))
  35. palette.setColor(QPalette.HighlightedText, Qt.black)
  36. app.setPalette(palette)
  37.  
  38. app.setStyleSheet("""
  39. QMainWindow {
  40. background-color: #353535;
  41. }
  42. QLabel {
  43. color: white;
  44. }
  45. QPushButton {
  46. background-color: #454545;
  47. border: 1px solid #555;
  48. padding: 8px;
  49. min-width: 120px;
  50. color: white;
  51. }
  52. QPushButton:hover {
  53. background-color: #555;
  54. }
  55. QPushButton:pressed {
  56. background-color: #353535;
  57. }
  58. QPushButton:disabled {
  59. color: #888;
  60. }
  61. QTableWidget {
  62. background-color: #252525;
  63. border: 1px solid #444;
  64. gridline-color: #444;
  65. color: white;
  66. }
  67. QHeaderView::section {
  68. background-color: #353535;
  69. padding: 5px;
  70. border: none;
  71. color: white;
  72. }
  73. QTableWidget::item {
  74. border-bottom: 1px solid #444;
  75. }
  76. """)
  77.  
  78. class ResourceAllocatorApp(QMainWindow):
  79. def __init__(self):
  80. super().__init__()
  81. self.setWindowTitle("Resource Allocator")
  82. self.setGeometry(100, 100, 900, 700)
  83. self.max_cores = os.cpu_count()
  84. self.is_active_mode = False
  85.  
  86. self.init_ui()
  87.  
  88. self.timer = QTimer()
  89. self.timer.timeout.connect(self.update_processes)
  90. self.timer.start(1000)
  91.  
  92. def init_ui(self):
  93. main_widget = QWidget()
  94. main_layout = QVBoxLayout(main_widget)
  95. main_layout.setContentsMargins(20, 20, 20, 20)
  96. main_layout.setSpacing(15)
  97.  
  98. # Заголовок
  99. header = QLabel("Resource Allocator")
  100. header.setFont(QFont("Arial", 18, QFont.Bold))
  101. header.setAlignment(Qt.AlignCenter)
  102. main_layout.addWidget(header)
  103.  
  104. # Панель информации
  105. info_frame = QFrame()
  106. info_frame.setFrameShape(QFrame.StyledPanel)
  107. info_layout = QVBoxLayout(info_frame)
  108. info_layout.setContentsMargins(15, 15, 15, 15)
  109.  
  110. self.mode_label = QLabel("Режим: Стандартный планировщик Windows")
  111. self.mode_label.setFont(QFont("Arial", 12, QFont.Bold))
  112.  
  113. self.core_label = QLabel(f"Всего ядер в системе: {self.max_cores}")
  114. self.core_label.setFont(QFont("Arial", 11))
  115.  
  116. info_layout.addWidget(self.mode_label)
  117. info_layout.addWidget(self.core_label)
  118. main_layout.addWidget(info_frame)
  119.  
  120. # Кнопки управления
  121. btn_frame = QFrame()
  122. btn_layout = QHBoxLayout(btn_frame)
  123. btn_layout.setContentsMargins(0, 0, 0, 0)
  124.  
  125. self.btn_enable = QPushButton("Включить все ядра")
  126. self.btn_enable.setFont(QFont("Arial", 11))
  127. self.btn_enable.clicked.connect(self.enable_all_cores)
  128. self.btn_enable.setFixedHeight(40)
  129.  
  130. self.btn_disable = QPushButton("Выключить (стандартный режим)")
  131. self.btn_disable.setFont(QFont("Arial", 11))
  132. self.btn_disable.clicked.connect(self.disable_all_cores)
  133. self.btn_disable.setFixedHeight(40)
  134. self.btn_disable.setEnabled(False)
  135.  
  136. btn_layout.addWidget(self.btn_enable)
  137. btn_layout.addWidget(self.btn_disable)
  138. main_layout.addWidget(btn_frame)
  139.  
  140. # Таблица процессов
  141. self.process_table = QTableWidget()
  142. self.process_table.setColumnCount(3)
  143. self.process_table.setHorizontalHeaderLabels(["Процесс", "PID", "Режим ядер"])
  144. self.process_table.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)
  145. self.process_table.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeToContents)
  146. self.process_table.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeToContents)
  147. self.process_table.setFont(QFont("Arial", 10))
  148. self.process_table.setAlternatingRowColors(True)
  149. main_layout.addWidget(self.process_table)
  150.  
  151. self.setCentralWidget(main_widget)
  152.  
  153. def enable_all_cores(self):
  154. self.is_active_mode = True
  155. for proc in psutil.process_iter(['pid']):
  156. try:
  157. proc.cpu_affinity(list(range(self.max_cores)))
  158. except (psutil.NoSuchProcess, psutil.AccessDenied):
  159. continue
  160.  
  161. self.mode_label.setText("Режим: Все процессы используют все ядра")
  162. self.btn_enable.setEnabled(False)
  163. self.btn_disable.setEnabled(True)
  164.  
  165. def disable_all_cores(self):
  166. self.is_active_mode = False
  167. for proc in psutil.process_iter(['pid']):
  168. try:
  169. proc.cpu_affinity(list(range(self.max_cores)))
  170. except (psutil.NoSuchProcess, psutil.AccessDenied):
  171. continue
  172.  
  173. self.mode_label.setText("Режим: Стандартный планировщик Windows")
  174. self.btn_enable.setEnabled(True)
  175. self.btn_disable.setEnabled(False)
  176.  
  177. def update_processes(self):
  178. if self.is_active_mode:
  179. self.enable_all_cores()
  180. self.update_process_table()
  181.  
  182. def update_process_table(self):
  183. try:
  184. processes = []
  185. for proc in psutil.process_iter(['pid', 'name', 'cpu_affinity']):
  186. try:
  187. processes.append({
  188. 'name': proc.info['name'],
  189. 'pid': proc.info['pid'],
  190. 'cores': len(proc.info['cpu_affinity']) if proc.info['cpu_affinity'] else 0
  191. })
  192. except (psutil.NoSuchProcess, psutil.AccessDenied):
  193. continue
  194.  
  195. processes.sort(key=lambda x: x['name'])
  196.  
  197. self.process_table.setRowCount(len(processes))
  198. for row, proc in enumerate(processes):
  199. self.process_table.setItem(row, 0, QTableWidgetItem(proc['name']))
  200. self.process_table.setItem(row, 1, QTableWidgetItem(str(proc['pid'])))
  201.  
  202. # Измененное отображение информации о ядрах
  203. if self.is_active_mode:
  204. core_text = f"Использует {proc['cores']} ядер" if proc['cores'] > 0 else "Нет доступа"
  205. else:
  206. core_text = "Стандартный режим Windows"
  207.  
  208. self.process_table.setItem(row, 2, QTableWidgetItem(core_text))
  209.  
  210. except Exception as e:
  211. logging.error(f"Ошибка при обновлении таблицы: {e}")
  212.  
  213. def handle_exception(exc_type, exc_value, exc_traceback):
  214. logging.error("Неперехваченное исключение", exc_info=(exc_type, exc_value, exc_traceback))
  215.  
  216. if __name__ == "__main__":
  217. app = QApplication(sys.argv)
  218. DarkTheme.setup(app)
  219.  
  220. window = ResourceAllocatorApp()
  221. window.show()
  222. sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement