PyQt MainWindow 在 Windows 上使用多处理

2024-05-02

我尝试创建一个PyQt应用。为了在后台运行进程并保持PyQt5应用程序可用于新指令,我想使用multiprocessing。 在 Windows 操作系统上,当我从 Qt 调用函数时MainWindow与 一起上课multiprocessing.process,我在腌制这个类时遇到错误。但它在 Linux 上运行 find。

这是一个例子:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys          
import multiprocessing

# 
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class Frame_main(QMainWindow):

    def __init__(self, parent = None):
        super(Frame_main, self).__init__(parent)
        self.thrd_list=[]
        self.initUI()

    def initUI(self):

        # Button 
        btn_run = QPushButton('Run', self)      
        btn_run.clicked.connect(lambda: self.ThdSomething(self.DoRun) ) #
        btn_stop = QPushButton('Stop', self)     
        btn_stop.clicked.connect(self.DoStop)    


        ### TEXT Edit       
        self.textEdit_term = QTextEdit("terminal: \n ")
        self.textEdit_term.append("")
        self.textEdit_term.setStyleSheet("color: rgb(255, 255, 255); background-color: black;")
        self.textEdit_term.setLineWrapMode(QTextEdit.NoWrap)
        self.textEdit_term.setToolTip(' terminal message ')
        self.textEdit_term.setStatusTip('textEdit1')

        ### LAYOUT
        Wid_main = QWidget()                    # 
        grid_major = QGridLayout()              # 
        grid_major.addWidget( btn_run, 1, 5)
        grid_major.addWidget( btn_stop, 2, 5)
        Wid_main.setLayout(grid_major)

        self.setCentralWidget(Wid_main)

        ### Affichage 
        self.show()                 #

    # 
    def DoRun(self):
        print('g starts')
        time_start=time.time()
        time_stop=time.time()
        name='bob'
        n=0
        while time_stop-time_start <2 :
            n+=1
            time_stop=time.time()
            time.sleep(0.8)
            print ('hola', name,n, flush=True)
        print('g stops')

    def DoStop(self):
        ''' subourtine kill all the thread '''
        print('stop action detected')
        while len(self.thrd_list) > 0 :
            print("Terminating the job: {}".format(self.thrd[-1].pid) )
            os.kill(self.thrd[-1].pid, signal.SIGTERM) 
            self.thrd_list[-1].terminate()

            self.thrd_list.pop()


    def ThdSomething(self, job):
        ''' subourtine to create a new thread to do the job subroutine '''
        arg=''
        p=multiprocessing.Process(target=job, args=(arg))
        self.thrd_list.append( p )
        p.start()
        print("Start the job GUI: {} with PID: {}".format(str(job) ,self.thrd[-1].pid), file=sys.stdout )


    def closeEvent(self, event):
        ''' subroutine to define what happen when closing the main frame'''
        self.statusBar().showMessage('waiting for a respond') 
        reply = QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QMessageBox.Yes | 
            QMessageBox.No, QMessageBox.No)
        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()


# Main
if __name__ == '__main__':  
    # Create QApplication and Main Frame
    Qapp = QApplication(sys.argv)   # creation de lappli Qt
    Qapp.setStyle("fusion")         # 
    frame1 = Frame_main()           # 

    sys.exit(Qapp.exec_())          #

EDIT:

我发现了几个类似的案例,例如:Python:pyqt 应用程序中的多处理 https://stackoverflow.com/questions/15520957/python-multiprocessing-in-pyqt-application?rq=1但他们都没有帮助。我认为这可能与我的案例使用的功能和属性有关MainWindow class.


您是正确的,这是由于尝试派生 GUI 类中的方法所致。不幸的是,Windows 并不真正具有像 Linux 那样分叉进程的能力,这就是为什么您的代码可以在 Linux 上运行而不是在 Windows 上运行。这多处理库的 Python 3 文档 https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods有一些关于差异以及不同平台下启动新进程的默认方法的有用信息。

回答你的问题:因为你的目标是与 GUI 对象关联的方法,所以它必须将对象状态发送到新进程,但无法对其进行 pickle,因为 PyQt GUI 对象太复杂而无法 pickle。

如果您重写代码以便目标函数(并且args指定)是可挑选的,您的代码将起作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyQt MainWindow 在 Windows 上使用多处理 的相关文章

随机推荐

  • 如何在谷歌地图的边缘创建填充

    我有一个非常繁忙的谷歌地图应用程序 我正在尝试在地图的外边缘周围创建一个 缓冲区 以便谷歌地图命令不会把东西放在那里 我的解决方案是创建不可见的 div 并将它们作为控件添加到地图中 每个边缘一个 这似乎很有效 因为所有谷歌命令都会看到它们
  • 无法覆盖 Rustup 工具链以自定义构建 iOS 工具链

    我正在用我的 Rust 版本创建我自己的工具链 我需要它与 iOS 架构进行交叉编译 当尝试设置默认工具链或覆盖当前目录的工具链时 我收到有关工具链名称的错误 以下是我创建这个新工具链所采取的步骤 创建 Rustup 工具链 rustup
  • Twitter Bootstrap 2:如何获得响应式设计以将侧边栏放在底部而不是顶部?

    Twitter 的 Bootstrap 2 http twitter github com bootstrap 最后添加了原生响应式设计 但是 默认情况下 当浏览器宽度低于最小宽度时 它将侧边栏放在顶部 我可以看到这对于许多网站来说是如何工
  • 执行 rebase 后,Git 提交会在同一分支中重复

    我理解 Pro Git 中提出的场景是关于变基的危险 https git scm com book en v2 Git Branching Rebasing rebase peril 作者基本上告诉你如何避免重复提交 不要对已推送到公共存储
  • Flex,连续扫描流(来自套接字)。我是否错过了使用 yywrap() 的某些内容?

    使用 Flex 进行模式识别 在基于套接字的扫描仪 连续流 上工作 Flex 找不到与 数组边界 重叠的匹配项 所以我实现了 yywrap 来设置新的数组内容 一旦 yylex 检测到 它将调用 yywrap 到目前为止还没有成功 基本上
  • Linux下对多个文件进行排序

    我有多个 很多 文件 每个都非常大 file0 txt file1 txt file2 txt 我不想将它们合并到一个文件中 因为生成的文件将超过 10 场演出 每个文件中的每一行都包含一个 40 字节的字符串 现在字符串的排序相当好 大约
  • 更快的第二好 MST 算法?

    我正在为此苦苦挣扎 我们可以使用 Kruskal 算法或 Prim 算法得到 MST 对于 第二好的 MST 我可以 首先使用上述任一算法获取 MST 对于来自 MST 的最优边缘的每个 V 1 A 首先删除或标记边缘b 继续计算 MST
  • 尝试使 Tableview 可点击时发生 JavaFX 错误

    我正在尝试使表格视图可单击 它将返回单击的单元格中的文本 尝试在 Netbeans 中编译时收到两个错误 所有代码均取自 示例12 11 单元格编辑的替代解决方案 官方表格视图教程 http docs oracle com javafx 2
  • 静态/动态类型与静态/动态绑定

    大家这4个术语有什么区别 能举个例子吗 Static and dynamic是指解决某些编程元素的时间点的行话 Static表示解析是在程序构建时发生的 Dynamic表示解析是在程序运行时发生的 静态和动态打字 Typing指由于数据值之
  • Spring webflux 中 Mono> 与 Flux 的区别

    我的理解是Mono
  • 在 Android 设备/模拟器上加载 NPAPI 插件

    我编译了从这个链接获得的示例 NPAPI 插件http code google com p npapi sdk http code google com p npapi sdk 使用NDK编译后 我得到了 so文件libs armeabi
  • 速度事件处理程序

    在速度中 当你执行 object variable 时 如果它无法找到 getter 函数 访问它或者 getter 返回 null 它只会在页面上显式显示 object variable 我知道有一个安静的参考 但我不想添加 对数千个变量
  • 针对 Laravel 后端的 Angular Auth

    我正在使用 Laravel 创建一个应用程序 并构建一个小型内部 API 来连接到 Angular 前端 我的身份验证工作正常 但想确保这是一种可接受的用户登录方式 并确保一切都是安全的 会话控制器 public function inde
  • XP 和 Vista 之间使用 Winsock API 的 UDP 多播差异

    Windows XP 和 Windows Vista 之间设置 UDP 多播套接字所需的实现似乎有所不同 具体来说 在 Windows XP 下 您must call bind 在您可以引用任何特定于多播的套接字选项之前 然而 在windo
  • sqlite:获取所有行的最快方法(连续磁盘访问)

    我想使用 system data sqlite 读取表中的所有行 由于我有一个非常大的表 gt 450GB 超过 60 亿行 我想确保 sqlite 将使用连续的磁盘访问 正如您可能知道的那样 对硬盘的随机访问速度很慢 由于内存限制 我无法
  • 上传大文件(几 GB)时,nginx 返回内部服务器错误

    我在 nginx 后面有一个 Artifactory 上传大于 4 GB 的文件失败 我相当确定这是 nginx 的错误 因为如果文件从本地主机上传 上传到本地主机 则不会出现问题 nginx 设置为client max body size
  • SailsJS:如何正确地对控制器进行单元测试?

    一直在使用 Sails js 但在为控制器进行 Jasmine 单元测试时遇到了困难 如果这是显而易见的事情 请原谅我的无知 因为我在过去的 3 4 个月里才深入研究 JavaScript 开发 在过去的框架 特别是 ASP Net MVC
  • Windows 服务和 Windows 进程有什么区别?

    是什么不同之处窗户之间service和一个窗户process 服务是真正的 Windows 进程 没有区别 服务的唯一特殊之处在于它由操作系统启动并在单独的会话中运行 一种独立的方式 可防止其干扰桌面会话 传统上命名为daemon http
  • 确保 HttpConfiguration.EnsureInitialized()

    我已经安装了 Visual Studio 2013 当我运行我的应用程序时 出现以下错误 我不知道在哪里初始化这个对象 该怎么办 Server Error in Application The object has not yet been
  • PyQt MainWindow 在 Windows 上使用多处理

    我尝试创建一个PyQt应用 为了在后台运行进程并保持PyQt5应用程序可用于新指令 我想使用multiprocessing 在 Windows 操作系统上 当我从 Qt 调用函数时MainWindow与 一起上课multiprocessin