精华内容
下载资源
问答
  • QT多进程界面程序

    2021-06-09 17:49:40
    关键点 使用两个函数 QWindow * fromWinId(WId id); QWidget *QWidget::createWindowContainer(QWindow *...功能:显示界面,并将窗口1的wid写入QSetting配置文件(或者其它主进程能获取子进程id的方式都行) 子窗口2

    适合主进程界面与子进程界面都是QT界面的情况,其他进程的情况请参考其他文章,需要区分平台。

    关键点
    使用如下两个函数,QWInow类是Qt5.0之后提供的,Qt4版本是否有代替的未去深究,主要这个功能需求比较少,很少涉及。
    QWindow * fromWinId(WId id);
    QWidget *QWidget::createWindowContainer(QWindow *window, QWidget *parent = Q_NULLPTR, Qt::WindowFlags flags = Qt::WindowFlags())

     

    下面示例三个程序都在一个目录下,每个app在相应的子目录下面

    示例:

    子窗口1为MyWidget1,为应用程序
    功能:显示界面,并将窗口1的wid写入QSetting配置文件(或者其它主进程能获取子进程id的方式都行)


    子窗口2为MyWidget2,为应用程序
    功能:显示界面,并将窗口2的wid写入QSetting配置文件

    主窗口进程启动两个子进程并从 QSetting文件获取两个子窗口的wId;

    然后使用下面两个函数将两个窗口添加到主界面上就行了。
    QWindow *childWin1 = QWindow::fromWinId(wid1);  //根据子窗口id获取QWindow指针
    QWindow *childWin2 = QWindow::fromWinId(wid2);
    if(childWin1 && childWin2)

    {
            QVBoxLayout *ver = new QVBoxLayout;
            childWin1->setFlags(childWin1->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint );
            QWidget *widget1 = QWidget::createWindowContainer(childWin1,this,Qt::Widget); //根据获取的QWindow指针创建一个容器来放子窗口界面
            ver->addWidget(widget1);
            childWin2->setFlags(childWin2->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint );
            QWidget *widget2 = QWidget::createWindowContainer(childWin2,this,Qt::Widget);
            ver->addWidget(widget2);
            //设置边距
            ver->setContentsMargins(5,5,5,5);
            ver->setSpacing(0);
            this->setLayout(ver);

     }

    展开全文
  • 多进程界面开发

    2021-10-29 11:05:14
    所说的多进程界面开发,其实就是两个程序,其中一个主进程exe启动后,需要启动其他进程,并且把其他进程的界面嵌入到我们主进程的窗口中来。 我们平时用到多进程软件查看,如下图所示: 1、启动外部子进程 启动外部...

    说明

    所说的多进程界面开发,其实就是两个或多个进程,其中一个主进程exe启动后,需要启动其他进程,并且把其他进程的界面嵌入到我们主进程的窗口中来。
    我们平时用到多进程软件查看,如下图所示:
    在这里插入图片描述

    1、启动外部子进程

    启动外部进程方式很多,这里例举两个:
    (1)QProcess方式

    QProcess * myProcess = new QProcess(this);
    QStringList arguments;
    myProcess->start("C:/Windows/System32/MyApp.exe");
    myProcess->waitForFinished(2000);
    

    (2)CreateProcess方式(只适用于windows)

    #include<Windows.h>
    
    QString cmd = "C:/Windows/system32/MyApp.exe";
    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = true;
    
    bool bRet = CreateProcess(
    	NULL,
    	(LPWSTR)cmd.toStdWString().c_str(),
    	NULL,
    	NULL,
    	FALSE,
    	CREATE_NEW_CONSOLE,
    	NULL,
    	NULL, &si, &pi);
    

    2、找到外部进程类名和窗口名并获取其句柄

    (1)找到外部进程类名和窗口名
    我们可以使用SPY++工具进行查看外部进程的类名称和窗口名称。
    具体教程可参考:https://blog.csdn.net/u013394556/article/details/78534833
    说明:Microsoft Spy++是一个非常好的查看Windows操作系统的窗口、消息、进程、线程信息的工具,简单易用,功能强大。
    (2)获取外部进程句柄

    #include<Windows.h>
    	
        WId wid = (WId)FindWindow( QStringLiteral("Qt5QWindowIcon").toStdWString().c_str(),
        						   QStringLiteral("MyApp软件").toStdWString().c_str());
    

    3、将外部界面嵌入到主界面布局

    在第二步获取到句柄后,可以依据句柄获取其窗体并嵌入到新的Widget中,如何将这个新的Widget加入到主界面布局。

        WId wid = (WId)FindWindow( QStringLiteral("Qt5QWindowIcon").toStdWString().c_str(),
        						   QStringLiteral("MyApp软件").toStdWString().c_str());
        if(wid)
        {
            QWindow * window = QWindow::fromWinId(wid);		//依据句柄获取窗体
            if(window != NULL)
            {
                QWidget * widget = QWidget::createWindowContainer(window, NULL, Qt::Widget);
                widget->show();
            }
        }
    

    4、总结

    最后说明一下,按1、2、3步骤多加入几个窗口,就可以像说明中的图片一样,如chrom浏览器,想打开多少子窗口就打开多少。
    以前还真的没有意识到经常使用的软件都是使用多进程框架编程的。

    展开全文
  • 一、概述做客户端开发已经有好...但是心里又在默默的想,这个东西到底有什么好处,多进程界面!!!从来没这么搞过呀,会不会有坑,到底比多线程好在了哪里?带着这个问题,从百度上看了几篇相关文章,主要是讲解...

    一、概述

    做客户端开发已经有好几个年头了,今天看到同事发了一篇关于富途牛牛的文章,核心思想就是想说,新版本的富途支持多进程架构了,效率大大提升啦,可以更好的里有多核CPU,提供软件运行效率。

    听到这个消息,我不仅感叹,我靠,真的好牛逼。

    但是心里又在默默的想,这个东西到底有什么好处,多进程写界面!!!从来没这么搞过呀,会不会有坑,到底比多线程好在了哪里?带着这个问题,从百度上看了几篇相关文章,主要是讲解了线程和进程的一些区别。当然了,最重要的还是目前的多进程架构的客户端已经开始变得多了起来。

    其实很早以前就接触过多进程,支持自己好想也没有想那么多,一直对多进程架构的概念不是那么清晰。今天和同事聊了一些相关话题,感觉自己的知识面豁然开朗,要学习的东西好像还挺多。

    看下面这张图,是任务管理器的应用截图,以前还真是没发现,居然我自己用的这么多应用都是多进程架构的。

    我们平时最常用的Chrome浏览器,客户端版本微信,还有有道云笔记等等

    有了这么多的多进程架构开发的客户端软件,难道说多进程开发已经是势在必行了?

    说这么多,还不如来点儿实际的干货,这篇文章是我初步开始使用多进程开发段产品的初步尝试,有不对的地方欢迎大家指出,可以给出更好建议

    二、效果展示

    下面是我做的一个demo程序截图,测试程序中一共包含了4个使用场景,分别是:

    Qt嵌入系统自带计算机

    Qt嵌入系统自带记事本

    Qt调用系统ping命令,并收集结果

    Qt嵌入其他Qt可执行程序

    大家可以先看看效果图,如果觉着有价值的可以继续往下看,下面我会分章节把四个事例进行讲解。

    三、使用方法

    首先需要清楚,我们是多进程界面开发,那么我们的exe启动后,势必是需要启动其他可执行程序的,并且把其他进程的界面嵌入到我们的窗口中来

    1、启动外部进程

    启动外部进程有多重方式,Qt使用比较习惯的同学可以直接使用QProcess类,这个类是Qt封装的一个跨平台的类。

    启动方式可能像下面这样

    QProcess * myProcess = new QProcess(this);

    QStringList arguments;

    myProcess->start("C:/Windows/System32/notepad.exe");

    myProcess->waitForFinished(2000);

    除过QProcess之外,Windows系统上我们还可以使用CreateProcess方法来创建进程。

    QString cmd = "C:/Windows/system32/calc.exe";

    STARTUPINFO si = { sizeof(si) };

    PROCESS_INFORMATION pi;

    si.dwFlags = STARTF_USESHOWWINDOW;

    si.wShowWindow = true;

    bool bRet = CreateProcess(

    NULL,

    (LPWSTR)cmd.toStdWString().c_str(),

    NULL,

    NULL,

    FALSE,

    CREATE_NEW_CONSOLE,

    NULL,

    NULL, &si, &pi);

    2、创建Qt窗口

    外部进程启动后,我们可以在任务管理器中找到启动的进程

    接着我们需要使用SPY++工具进行查看外部进程的类名称和窗口名称,并使用FindWindow接口进程查找,找到这个进程的主窗口句柄后,嵌入到我们的程序中来。

    类名和窗口名称查找过程可以参考外部进程嵌入到Qt进程界面这篇文章中的内容。

    WId wid = (WId)FindWindow(QStringLiteral("Notepad").toStdWString().c_str()

    , QStringLiteral("无标题 - 记事本").toStdWString().c_str());

    QWindow * window = QWindow::fromWinId(wid);

    if (window)

    {

    window->setFlags(window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint); //这边可以设置一下属性

    QWidget * widget = QWidget::createWindowContainer(window, this, Qt::Widget);

    }

    如上代码所示,我们如果找到外部进程的主窗口句柄后,就可以使用Qt提供的createWindowContainer这个接口进行创建QWidget,并加入到我们的程序中来。

    3、加入到主进程布局

    外部进程被封装成为一个QWidget后,我们只需要加入到自己的布局中即可。

    ui.verticalLayout_2->addWidget(widget);

    接下来我们分别讲解不同场景下的多进程界面开发的简单使用

    四、嵌入NotePad

    第三小节已经把嵌入其他程序的流程大致说了一遍,这里我就不在详细说明了,直接给出具体代码。

    代码中比较关键的有2个地方

    QProcess不能使用临时变量,要不然函数执行完毕notepad.exe进程也就退出了。

    FindWindow的两个参数,一个是类名,一个窗口标题栏名称,这两个信息都可以用个SPY++进行查找。

    void EmbedCalculate::on_pushButton_2_clicked()

    {

    //创建进程

    QString cmd = "C:/Windows/System32/notepad.exe";

    QProcess * myProcess = new QProcess(this);

    QStringList arguments;

    myProcess->start(cmd);

    myProcess->waitForFinished(2000);

    WId wid = (WId)FindWindow(QStringLiteral("Notepad").toStdWString().c_str()

    , QStringLiteral("无标题 - 记事本").toStdWString().c_str());

    QWindow * window = QWindow::fromWinId(wid);

    if (window)

    {

    window->setFlags(window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint); //这边可以设置一下属性

    QWidget * widget = QWidget::createWindowContainer(window, this, Qt::Widget);

    ui.verticalLayout_2->addWidget(widget);

    }

    }

    五、调用Ping命令

    ping命令使用场景主要是想展示主进程和外部进程是怎样通信的,虽然这个事例比较简单,但也算是两者之间发生了信息交换

    子进程在执行完ping一个地址之后,会把得到的结果传递给主进程,主进程使用readAll函数全部读入到主进程中。

    void EmbedCalculate::on_pushButton_3_clicked()

    {

    //创建进程

    QProcess * myProcess = new QProcess(this);

    connect(myProcess, static_cast(&QProcess::finished), this, [this, myProcess](int exitCode){

    if (exitCode == 0) {

    QTextCodec * gbkCodec = QTextCodec::codecForName("GBK");

    QString result = gbkCodec->toUnicode(myProcess->readAll());

    ui.textEdit->setText(result);

    }

    });

    //myProcess->start("cmd.exe", QStringList() << "/c" << "ping www.baidu.com");

    myProcess->start("cmd.exe", QStringList() << "/c" << "ping " + ui.lineEdit->text().trimmed());

    myProcess->waitForFinished(2000);

    ···

    }

    六、嵌入其他QWidget窗体

    虽然这个东西是最后讲的,但是这个才是重头戏,有了这个实验之后,我们以后的Qt多进程界面开发也可以进行投入正式环境了。

    如下所示,ChildWidget外部程序的主窗体被我们嵌入到了EmbedCalculate这个进程的主界面上,突然觉着好神奇,给自己点赞,哈哈哈哈。

    由于我这里的ChildWidget外部程序和EmbedCalculate主程序在一个目录中,因此cmd变量直接就指向了ChildWidget这个外部程序的名称。

    其他部分的代码基本上就和前边几种使用场景差不多。

    void EmbedCalculate::on_pushButton_4_clicked()

    {

    //创建进程

    QString cmd = "ChildWidget.exe";

    QProcess * myProcess = new QProcess(this);

    QStringList arguments;

    myProcess->start(cmd);

    myProcess->waitForFinished(2000);

    WId wid = (WId)FindWindow(QStringLiteral("Qt5QWindowIcon").toStdWString().c_str()

    , QStringLiteral("ChildWidget").toStdWString().c_str());

    QWindow * window = QWindow::fromWinId(wid);

    if (window)

    {

    window->setFlags(window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint); //这边可以设置一下属性

    QWidget * widget = QWidget::createWindowContainer(window, this, Qt::Widget);

    ui.verticalLayout_3->addWidget(widget);

    }

    }

    七、相关文章

    以上的内容,基本上就是本篇文章的内容所有内容啦!序列化和反序列化功能基本完成,希望可以帮到大家。

    如果您觉得文章不错,不妨给个打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!!

    很重要--转载声明

    本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords

    如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。

    展开全文
  • PyQt类多进程

    2021-02-03 20:48:18
    GUI元素(包括QWidget)只能在主线程中创建。在但是,您可以将每个选项卡的模型和业务逻辑放在单独的...在这样,如果任何工作进程挂起,它不会影响主GUI线程的响应。在class MyTab(QtGui.QWidget):def __init__(sel...

    GUI元素(包括QWidget)只能在主线程中创建。在

    但是,您可以将每个选项卡的模型和业务逻辑放在单独的线程中,并让每个选项卡使用Signals和Slots与主线程通信。Qt documentation for ^{}提供了一个Worker模式的示例。在

    这样,如果任何工作进程挂起,它不会影响主GUI线程的响应。在class MyTab(QtGui.QWidget):

    def __init__(self, parent):

    ...

    self.worker = Worker()

    self.thread = QtCore.QThread(self)

    self.worker.moveToThread(self.thread)

    self.worker.resultReady.connect(self.handleResult)

    self.thread.start()

    def callSomeFunction(self):

    QtCore.QMetaObject.invokeMethod(self.worker, 'someFunction', QtCore.Qt.QueuedConnection, QtCore.Q_ARG(str, 'arg1'))

    @QtCore.pyqtSlot(object)

    def handleResult(self, result):

    ... # do stuff with result

    class Worker(QtCore.QObject):

    resultReady = QtCore.pyqtSignal(object)

    @QtCore.pyqtSlot(str)

    def someFunction(self, arg):

    ...

    self.resultReady.emit({'func': 'someFunction', 'result': True})

    展开全文
  • 多进程编程多任务编程分为:多进程,多线程。多任务:多个任务同时执行,提高CPU的利用率。进程:一个正在执行的程序或软件,它是内存条分配资源的基本单元。并发:任务数 > CPU数并行:任务数 ≤ CPU数多进程的...
  • 界面刷新--多进程

    2021-07-16 13:44:51
    界面刷新–多进程 class mywindow(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self): super(mywindow, self).__init__() self.setupUi(self) self.pushButton.clicked.connect(self.th_create) #...
  • 我使用glade作为我的gui并创建一个进程来...在我关闭图形用户界面后,它还调用系统出口()但也会离开进程并且不会终止。我认为错误在于我如何实现我的流程或我的所有流程。有人能照一下这个吗?这也与我上一篇文章...
  • 单进程VS多进程

    2021-02-03 01:09:34
    从图中可以看出,最新的 Chrome 浏览器包括:1 个浏览器(Browser)主进程、1 个 GPU 进程、1 个网络(NetWork)进程个渲染进程个插件进程。下面我们来逐个分析下这几个进程的功能。浏览器进程。主要负责界面...
  • 子线程里是不能更新UI界面的,在移动端方面。Android的UI访问是没有加锁的,个线程可以同时访问更新操作同一个UI控件。也就是说访问UI的时候,android系统当中的控件都不是线程安全的,这将导致在线程模式下,当...
  • 但是,如果您需要执行长时间运行的任务,例如打开/写入一个大文件、下载一些数据或渲染一些复杂的界面,那么就会出现问题。对用户来说,应用程序似乎没有响应(因为它确实没有响应)。因为你的应用程序不再与操作系统...
  • 浏览器多进程详解

    2021-04-08 13:24:10
    一、浏览器的主要进程列表 Browser进程:浏览器的主进程(负责协调、主控),只有一个。作用有 ... 浏览器渲染进程(浏览器内核)(Renderer进程,内部是线程的):默认每个Tab页面一个进程,互不
  • 一、理解Linux下进程的结构Linux下一个进程在内存里有三部份的数据,就是“数据段”,“堆栈段”和“代码段”,其实学过汇编语言的人一定知道,一般的CPU象I386,都有上述三种段寄存器,以方便操作系统的运行。...
  • linux界面进程命令ps

    2021-05-15 12:16:54
    ps命令就是最根本相应情况下也是相当强大地进程查看命令,那么该命令的具体语法是什么呢?下面由学习啦小编为大家整理了linux下查看进程命令ps命令的相关知识,希望大家喜欢!1.linux查看进程ps命令的功能说明ps命令...
  • 要说线程 我们明确几个概念 1.1 名词 1.1.1 操作系统 操作系统是计算机系统中的一个系统软件,是一些程序模块的集合 它们能以尽量有效、合理的方式组合和管理计算机的软硬资源 系统效率,资源利用率 CPU利用率...
  • 进程调度实验的图形化界面实现实验报告课程名称 计算机操作系统 实验名称 作业调度的界面实现 实验日期 2016年5月 班级 计科 姓名 学号 实验目的:用高级语言编写和调试一个或个作业调度的模拟程序,以加深对作业...
  • 将Renderer进程得到的内存中的Bitmap,绘制到用户界面上。 网络资源的管理,下载等。 当访问一个新的网站时 ,主进程会启动一个新的渲染进程。 2.GPU进程 用于硬件加速图形绘制 3.渲染进程(也就是我们常说的...
  • 线程 是CPU调度的最小单位(线程 是建立在 进程 的基础上的一次程序运行单位,一个进程可以有个线程) 1.2 结合例子理解 工厂里有个车间,每个车间一个或个员工,每 进程 - - 工厂 ,工厂有独立的资源;工厂...
  • 在Android项目中使用RemoteViews实现跨进程更新界面发布时间:2020-11-21 17:20:21来源:亿速云阅读:104作者:Leah在Android项目中使用RemoteViews实现跨进程更新界面?相信很没有经验的人对此束手无策,为此本文...
  • 浏览器是多进程的,每打开一个tab页就会生产一个新进程。 Google浏览有优化机制,多个进程可能会被合并为一个 浏览器五大进程(2和5可以有多个) 1.Browser进程 a.界面显示,用户交互 b.页面管理:其他页面(进程)...
  • 尤其是在做断点下载/续传时,表现得比较明显 页面加载速度优化 影响页面加载速度的因素有非常,我们在对 WebView 加载一个网页的过程进行调试发现,每次加载的过程中都会有较的网络请求,除了 web 页面自身的 ...
  • 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。 程序的运行速度可能加快。 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较...
  • 但是为什么在使用的过程中一样会有很地方会出现卡死呢?这个问题其实也困或了我很久,但是今天终于解决了,而且我发现很多人有这样的问题,所以我分享一个例子方便大家参考。先来看看我的界面当我单击开始执行...
  • 浏览器多进程架构

    2021-03-13 17:05:33
    目前浏览器多进程架构进程和线程目前浏览器多进程架构浏览器主进程渲染进程GPU进程网络进程插件进程Tips 本文浏览器架构分析都基于Chrome 进程和线程 进程 一个进程就是一个程序的运行实例。启动一个程序时,...
  • 文章目录进程与线程JS(单线程)浏览器(多进程)渲染进程中的主要线程浏览器的进程模型、线程模型浏览器内多标签页之间通信方式进程间通信的方式 进程与线程 1、进程: 进程是CPU资源分配的最小单位 CPU是计算机的...
  • 本小节主要理解CEF的多进程模型,为后面的JavaScript与C++ 通信做一些知识储备,顺便再次梳理一下CEF的启动流程。 任务管理器观察多进程 CEF基于Chromium,是多进程模型。怎么理解多进程?启动一个Chrome浏览器,多...
  • 基于Qprocess和QWindow的QT外部进程启动及共享界面 Qprocess启动外部进程 QPocess简介 QT中的QProcess类用来启动一个外部进程序并与其进行通信。 代码及注意事项 #include <QProcess> QProcess * myProcess ...
  • 主程序中设置多进程,其中multiprocessing.freeze_support()可以实现:在程序打包后,运行时只出现一个界面,否则设置几个进程会增加出现几个窗口 import multiprocessing import test_main class mywindow(Qt...
  • 如何启动个任务栈的小程序 如何限制任务栈的启动个数 Demo Demo的github地址如下: https://github.com/Double2hao/ProcessTaskTest Demo如下图: Demo中打开任务栈的场景如下: 关键实
  • 每点击一次按钮,弹出一个对话框(子窗口)... 建立一个简单的主界面和一个自定义对话框from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectN...
  • Linux进程管理

    2021-05-13 01:58:30
    一、概念:1、程序与进程:程序:由指令和数据组成的静态文件,程序是为了达到特定目的,可以被计算机运行并且由命令代码组成的序列;指令:用于调度CPU工作,使CPU可以处理所需要的数据;进程:运行中的程序;2、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 335,461
精华内容 134,184
关键字:

多进程界面