55 lines
1.1 KiB
Python
55 lines
1.1 KiB
Python
from PySide6.QtCore import QObject, Signal
|
|
from threading import Thread
|
|
import subprocess
|
|
|
|
class ProcManager(QObject):
|
|
|
|
process_terminated = Signal(int, str)
|
|
|
|
def __init__(self) -> None:
|
|
super(ProcManager, self).__init__()
|
|
|
|
self.thre = None
|
|
self.proc = None
|
|
|
|
def start(self, proc):
|
|
# this method might override the old process and thread
|
|
self.proc = proc
|
|
|
|
self.thre = Thread(target=self.detect_end)
|
|
self.thre.start()
|
|
|
|
def stop(self):
|
|
if self.proc:
|
|
self.proc.terminate()
|
|
|
|
try:
|
|
self.proc.wait(1)
|
|
except subprocess.TimeoutExpired as e:
|
|
self.proc.kill()
|
|
|
|
if self.thre:
|
|
self.thre.join()
|
|
self.thre = None
|
|
|
|
def detect_end(self):
|
|
# wait for the process to terminate
|
|
while True:
|
|
try:
|
|
self.proc.wait(1)
|
|
break
|
|
except subprocess.TimeoutExpired as e:
|
|
continue
|
|
|
|
returncode = self.proc.returncode
|
|
errorstream = self.proc.stderr.read()
|
|
if isinstance(errorstream, bytes):
|
|
errorstream = errorstream.decode('utf-8')
|
|
|
|
self.proc = None
|
|
|
|
print('Process Terminated:', returncode, errorstream)
|
|
|
|
self.process_terminated.emit(returncode, errorstream)
|
|
|