小编Ric*_*ard的帖子

如何向 Python 中的各个线程发送 CTRL-C 信号?

我想弄清楚如何使用 Python 在 Windows 上正确发送 CTRL-C 信号。早些时候我在使用 youtube-dl 并将其嵌入到 PyQt Qthread 中进行处理并创建了一个停止按钮来停止线程但是在尝试下载直播时我无法让 FFMPEG 停止即使在关闭应用程序和我必须手动终止每次破坏视频的进程。
我知道我必须以某种方式向它发送 CTRL-C 信号并最终使用它。

os.kill(signal.CTRL_C_EVENT, 0)
Run Code Online (Sandbox Code Playgroud)

我实际上能够让它工作,但是如果您尝试下载多个视频并尝试使用上述信号停止其中一个线程,它将杀死所有下载。
有没有办法将信号发送到一个线程而不影响其他线程?
这是一些带有 2 个单独线程的常规 Python 代码示例,其中 CTRL-C 信号在 10 秒后在 thread_2 中触发,最终杀死了 thread_1。

import os
import signal
import threading
import time
import youtube_dl

def thread_1():
    print("thread_1 running")
    url = 'https://www.cbsnews.com/common/video/cbsn_header_prod.m3u8'
    path = 'C:\\Users\\Richard\\Desktop\\'
    ydl_opts = {
        'format': 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best',
        'outtmpl': '{0}%(title)s-%(id)s.%(ext)s'.format(path),
        'nopart': True,
    }
    ydl_opts = ydl_opts
    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        try:
            ydl.download([url])
        except KeyboardInterrupt:
            print('stopped')

def thread_2():
    print("thread_2 running")
    time.sleep(10) …
Run Code Online (Sandbox Code Playgroud)

python windows winapi multithreading

5
推荐指数
2
解决办法
5827
查看次数

PyQt - 将QGraphicsDropShadowEffect与多个小部件一起使用

我想使用QGraphicsDropShadowEffect在几个小部件上设置阴影,我想知道是否有更好的方法这样做,而不必为我想要使用它的每个实例反复编写相同的代码,如下面的示例所示.是否可以创建一个类或要调用的东西,以便我只需要设置setGraphicsEffect()小部件?我试图为它创建一些类,但我仍然只能让它们创建一个阴影.

import sys
from PyQt5.QtWidgets import QWidget, QHBoxLayout, \
    QGraphicsDropShadowEffect, QPushButton, QApplication, QComboBox


class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        layout = QHBoxLayout()

        self.shadow = QGraphicsDropShadowEffect()
        self.shadow.setBlurRadius(5)
        self.shadow.setXOffset(3)
        self.shadow.setYOffset(3)

        self.shadow2 = QGraphicsDropShadowEffect()
        self.shadow2.setBlurRadius(5)
        self.shadow2.setXOffset(3)
        self.shadow2.setYOffset(3)

        self.btn = QPushButton("Button")
        self.btn.setGraphicsEffect(self.shadow)
        self.combo = QComboBox()
        self.combo.setGraphicsEffect(self.shadow2)

        layout.addWidget(self.btn)
        layout.addWidget(self.combo)
        self.setLayout(layout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    app.exec_()
Run Code Online (Sandbox Code Playgroud)

python pyqt pyqt5 qgraphicseffect

3
推荐指数
1
解决办法
702
查看次数

尝试让 QProcess 使用队列

我正在尝试使用队列运行多个进程并获取所有进程的输出QProcess,但我遇到了一些问题。我正在使用 aQSpinBox设置同时运行的最大进程,并且我可以让主线程中的一切正常工作,或者如果我使用 a 中的进程运行循环,QObject但我无法让它在 a 中正常工作QThread
我知道不需要使用线程,QProcess但是使用循环我几乎别无选择。当在主线程中运行时,它会暂时冻结,直到进程启动,我宁愿让它运行得更顺畅。除非我使用类似的东西,否则
我只会在尝试运行进程时遇到错误,但问题是进程一次只运行一个。 有没有人有任何建议可以使其正常工作?我目前正在使用 Pyside2,但 Pyside2 或 PyQt5 的答案就可以了。谢谢。 QThread_process.waitForFinished()

import queue
import sys
from PySide2.QtCore import QProcess, QTextCodec, QThread, Qt
from PySide2.QtWidgets import QApplication, QWidget, QSpinBox, \
    QPushButton, QVBoxLayout

class Window(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.setAttribute(Qt.WA_DeleteOnClose, True)
        self.queue = queue.Queue()
        layout = QVBoxLayout(self)
        self.startBtn = QPushButton('Start', clicked=self.addToQueue)
        self.spinBox = QSpinBox(value=3)
        layout.addWidget(self.spinBox)
        layout.addWidget(self.startBtn)
        self.taskList = ['my.exe -value','my.exe -value','my.exe -value','my.exe -value',
                         'my.exe -value','my.exe -value','my.exe -value','my.exe -value'] …
Run Code Online (Sandbox Code Playgroud)

python queue qprocess pyqt5 pyside2

2
推荐指数
1
解决办法
1701
查看次数