当前位置: 首页 > news >正文

帝国做的网站/swot分析

帝国做的网站,swot分析,电商网站建设与运维需要的软件,营销型网站建设哪好一、概述做客户端开发已经有好几个年头了,今天看到同事发了一篇关于富途牛牛的文章,核心思想就是想说,新版本的富途支持多进程架构了,效率大大提升啦,可以更好的里有多核CPU,提供软件运行效率。听到这个消息…

一、概述

做客户端开发已经有好几个年头了,今天看到同事发了一篇关于富途牛牛的文章,核心思想就是想说,新版本的富途支持多进程架构了,效率大大提升啦,可以更好的里有多核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

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

http://www.jmfq.cn/news/5277727.html

相关文章:

  • 启迪网站建设招聘/北京搜索关键词优化
  • 公司简介模板免费如何写/举例说明什么是seo
  • 佛山网站优化怎么做/博客seo优化技术
  • 百度实景360度地图/网站搜索排名优化怎么做
  • 做废旧哪个网站好/电商培训机构排名
  • 我要在附近找工作/seo技术是干什么的
  • 济南做网站的好公司有哪些/seo软件工具
  • 网站运行维护/上海搜索引擎优化seo
  • 义乌建设局网站/seo排名点击首页
  • 建设网站企业网银登录/推广策划方案
  • 湖南英文网站建设/网站及搜索引擎优化建议
  • 如何做网站授权/企业网络营销策略分析
  • 嘉兴市城乡规划建设管理委员会网站/怎么做优化
  • 东营网站推广/网络广告营销方案
  • 做公益筹集项目的网站/企业网站的优化建议
  • 如何给网站做排名优化/东莞疫情最新数据
  • 自己做的网站怎么传入外网/凡科建站和华为云哪个好
  • 网站开发会计分录/公司如何做网络推广营销
  • 做铁艺需要什么网站/刷关键词怎么刷
  • 网站外包项目/百度左侧排名
  • app界面设计属于什么设计/玉溪seo
  • 新浪军事 手机新浪网/沈阳关键词快照优化
  • 网站建设需求报告/新乡网站优化公司推荐
  • 做水果网站首页的图片素材/百度推广账号怎么申请
  • 公司网站建设发票能抵扣不/东莞seo外包公司哪家好
  • 在线做静态头像的网站/公司网站建设需要注意什么
  • 监控视频怎么做直播网站/中国国家培训网官网查询
  • 四川省建筑信息平台/成都网站关键词推广优化
  • 昆明哪个公司做网站建设最好/怎么创建一个网址
  • 宣讲家网站两学一做/商务软文写作300字