Bad-Coder
@Bad-Coder
Баран

Почему все равно зависает?

app32.py:
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication
from threading import Thread
from _app32 import _GET_PROCESSES32, _ARG32, _UI_WINDOW32


_FORM32, _BACK_WINDOW32 = uic.loadUiType(_UI_WINDOW32)

_APP_WIN32 = QApplication(_ARG32)
_WINDOW32 = _BACK_WINDOW32()
_UI32 = _FORM32()
_UI32.setupUi(_WINDOW32)
_WINDOW32.show()

def GET_PROCESSES32(_FORM32):
    Thread(target=lambda: _GET_PROCESSES32(_FORM32)).run()

_UI32.pushButton.clicked.connect(lambda: GET_PROCESSES32(_UI32))

_APP_WIN32.exec_()


_app32.py:
from psutil import process_iter


_UI_WINDOW32 = 'gui32.ui'
_ARG32 = []
_UI_WINDOW32 = _UI_WINDOW32
_ARG32 = _ARG32

def _GET_PROCESSES32(_FORM32):
    if _FORM32.ProcessesMain.toPlainText() != '':
        _FORM32.ProcessesMain.setPlainText('')
    for process in process_iter():
        _FORM32.ProcessesMain.setPlainText(_FORM32.ProcessesMain.toPlainText() + str(process) + '\n')


gui32.ui:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>698</width>
    <height>502</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <property name="unifiedTitleAndToolBarOnMac">
   <bool>false</bool>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QWidget" name="Processes" native="true">
    <property name="geometry">
     <rect>
      <x>180</x>
      <y>80</y>
      <width>311</width>
      <height>231</height>
     </rect>
    </property>
    <widget class="QPlainTextEdit" name="ProcessesMain">
     <property name="geometry">
      <rect>
       <x>0</x>
       <y>0</y>
       <width>311</width>
       <height>231</height>
      </rect>
     </property>
     <property name="readOnly">
      <bool>true</bool>
     </property>
    </widget>
   </widget>
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>270</x>
      <y>370</y>
      <width>93</width>
      <height>28</height>
     </rect>
    </property>
    <property name="text">
     <string>PushButton</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>698</width>
     <height>26</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>


Почему я сделал Thread (в app32.py).
И при нажатие на pushButton программа все равно зависает на пару секунд?
Что делать?
  • Вопрос задан
  • 51 просмотр
Пригласить эксперта
Ответы на вопрос 1
@Vindicar
Потому что ты не понимаешь, как пользоваться классом Thread.
Метод run() - это тело потока, т.е. то что поток делает. По умолчанию он просто вызывает target, хотя иногда проще унаследоваться от Thread и переопределить его.
Так что вызов Thread(target=lambda: _GET_PROCESSES32(_FORM32)).run() абсолютно эквивалентен вызову _GET_PROCESSES32(_FORM32).
Если ты хочешь запустить код в отдельном потоке, используй метод start().

Thread(target=_GET_PROCESSES32, args=(_FORM32, )).start()

Правда, ещё вопрос, заработает ли обращение к GUI из другого потока... очень не все GUI платформы это позволяют.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы