精华内容
下载资源
问答
  • ZedBoard的AXI DMA收发独立双线程linux应用程序!有别于之前官方或者其它提供的单次发单次收。该代码包含速度测试,实测传输速率可以达到274MB/s。
  • 小程序的双线程模型

    2020-03-03 23:03:21
    我们可以在宿主环境上执行小程序的各种文件:wxml 、wxss 、js ,除此之外,宿主环境还为我们提供了小程序的双线程模型 不了解宿主环境可以点传送门 双线程模型 1.WXML 模块和 WXSS 样式运行于渲染层,渲染层使用 ...

    宿主环境

    小程序的宿主环境是谁?很显然,小程序的宿主环境是微信客户端

    宿主环境有什么作用呢?
    我们可以在宿主环境上执行小程序的各种文件:wxml 、wxss 、js ,除此之外,宿主环境还为我们提供了小程序的双线程模型

    不了解宿主环境可以点传送门

    双线程模型

    在这里插入图片描述
    1.WXML 模块和 WXSS 样式运行于渲染层,渲染层使用 WebView 线程进行渲染;因为一个小程序往往不只有一个页面,一个小程序通常会有多个页面,所以就会使用多个 WebView 的线程(也就是上图所示的那样)
    2. js 脚本(app.js/home.js等运行于逻辑层,逻辑层使用 JsCore 运行js 脚本
    3. 这两个线程都会经由微信客户端(Native)进行中转交互,从而渲染出我们看到的界面

    界面的渲染过程

    首先,我们需要知道,wxml 可以等价于一棵 DOM 树,另外也可以使用一个 js 对象来模拟 DOM 树,简称虚拟 DOM
    在这里插入图片描述

    所以说,我们可以先让 WXML 转换成 js 对象,然后再将其渲染成真正的 DOM 树
    在这里插入图片描述
    当要渲染的数据要发生变化时,小程序会产生一个新的 js对象,然后再将这两个 js 对象通过 diff算法 进行对比,找到有差异的地方,然后把这个差异应用到原来的 DOM 树上,从而达到更新界面的目的,这个也是“数据驱动”的原理
    在这里插入图片描述

    总结:界面渲染整体流

    1.在渲染层,宿主环境会把 WXML 转化成对应的j s 对象;
    2.将 js 对象再次转成真实 DOM 树,交由渲染层线程渲染;
    3.数据变化时,逻辑层提供最新的变化数据,js 对象发生变化比较进行 diff 算法对比;
    4.将最新变化的内容反映到真实的 DOM 树中,更新界面;

    参考:diff算法
    链接一
    链接二

    展开全文
  • 摘要:VC/C++源码,系统相关,双线程,多线程 基于VC++的双线程,多线程运算实例,如上图所示的窗口中,有两个线程,一个是计算9X9乘法,另一个线程则对1——100000以内的数进行求和运算,点击“开始”按钮后,两线程...
  • 摘要:VC/C++源码,系统相关,多线程同步 多线程十大经典案例之一秒杀多线程,多线程同步互斥问题《秒杀多线程第四篇一个经典的多线程同步问题》及解决多线程同步互斥的常用方法——关键段、事件、互斥量、信号量、...
  • 小程序的底层双线程框架解析

    千次阅读 2019-05-29 17:14:38
    技术选型上一节《小程序的诞生》中,我们也提到了小程序的双线程设计。 目前来说,页面渲染的方式主要有三种: Web 渲染。 Native 原生渲染。 Web 与 Native 两者掺杂,也即我们常说的 Hybrid 渲染。 前面也说过,...

    原文地址

    一切始于双线程


    技术选型

    上一节《小程序的诞生》中,我们也提到了小程序的双线程设计。

    目前来说,页面渲染的方式主要有三种

    1. Web 渲染。
    2. Native 原生渲染。
    3. Web 与 Native 两者掺杂,也即我们常说的 Hybrid 渲染。

    前面也说过,小程序最终的呈现形式,是 WebView + 原生组件,Hybrid 方式。我们结合之前对小程序的期望来看:

    • 开发门槛:Web 门槛低,不过 Native 也有像 RN 这样的框架支持
    • 体验:Native 体验比 Web 不要好太多,Hybrid 在一定程度上比 Web 接近原生体验
    • 版本更新:Web 支持在线更新,Native 则需要打包到微信一起审核发布
    • 管控和安全:Web 可跳转或是改变页面内容,存在一些不可控因素和安全风险

    由于小程序的宿主是微信,如果用纯客户端原生技术来编写小程序 ,那小程序代码需要与微信代码一起编包,跟随微信发版本,这种方式跟开发节奏必然都是不对的。
    所以方向应该是需要像 Web 技术那样,有一份随时可更新的资源包放在云端,通过下载到本地,动态执行后即可渲染出界面。

    如果用纯 Web 技术来渲染小程序,在一些有复杂交互的页面上可能会面临一些性能问题。
    这是因为在 Web 技术中,UI渲染跟 JavaScript 的脚本执行都在一个单线程中执行,这就容易导致一些逻辑任务抢占UI渲染的资源。

    总地看来,小程序选择了 Hybrid 的渲染方式,可以用一种近似 Web 的方式来开发,并且还可以实现在线更新代码。同时,引入原生组件有以下好处:

    • 扩展 Web 的能力。比如像输入框组件(input, textarea)有更好地控制键盘的能力
    • 体验更好,同时也减轻 WebView 的渲染工作
    • 绕过 setData、数据通信和重渲染流程,使渲染性能更好

    现在,我们还剩下一个很重要的问题:管控性和安全性。于是,双线程的设计被提出来了。

    双线程的小程序

    也不知道是哪位大佬,能想出双线程这样的模型,反正我是佩服得666的。

    双线程是什么?我们先来看个官方的图:
    image

    小程序的渲染层和逻辑层分别由 2 个线程管理:渲染层的界面使用了 WebView 进行渲染,逻辑层采用 JsCore 线程运行 JS 脚本。

    为什么要这么设计呢?前面提到的管控和安全,为了解决这些问题,我们需要阻止开发者使用一些浏览器提供的,诸如跳转页面、操作 DOM、动态执行脚本的开放性接口。

    我们可以使用客户端系统的 JavaScript 引擎,iOS下的 JavaScriptCore 框架,安卓下腾讯 x5 内核提供的 JsCore 环境。通过提供一个沙箱环境来运行开发者的 JavaScript 代码来解决。这个沙箱环境只提供纯 JavaScript 的解释执行环境,没有任何浏览器相关接口。

    这就是小程序双线程模型的由来:

    • 逻辑层:创建一个单独的线程去执行 JavaScript,在这个环境下执行的都是有关小程序业务逻辑的代码
    • 渲染层:界面渲染相关的任务全都在 WebView 线程里执行,通过逻辑层代码去控制渲染哪些界面。一个小程序存在多个界面,所以渲染层存在多个 WebView 线程

    双线程通信

    把开发者的 JS 逻辑代码放到单独的线程去运行,但在 Webview 线程里,开发者就没法直接操作 DOM。那要怎么去实现动态更改界面呢?

    前面我们知道,逻辑层和渲染层的通信会由 Native (微信客户端)做中转,逻辑层发送网络请求也经由 Native 转发。这是不是意味着,我们可以把 DOM 的更新通过简单的数据通信来实现呢?

    Virtual DOM 相信大家都已有了解,大概是这么个过程:用JS对象模拟DOM树 -> 比较两棵虚拟DOM树的差异 -> 把差异应用到真正的DOM树上

    在这里我们可以用上,如图:

    image

    1. 在渲染层把 WXML 转化成对应的 JS 对象。
    2. 在逻辑层发生数据变更的时候,通过宿主环境提供的 setData 方法把数据从逻辑层传递到 Native,再转发到渲染层。
    3. 经过对比前后差异,把差异应用在原来的 DOM 树上,更新界面。

    我们通过把 WXML 转化为数据,通过 Native 进行转发,来实现逻辑层和渲染层的交互和通信。而这样完整的一套框架,基本上都是通过小程序的基础库来完成的。

    小程序的基础库

    小程序的基础库是 JavaScript 编写的,它可以被注入到渲染层和逻辑层运行。主要用于:

    • 在渲染层,提供各类组件来组建界面的元素
    • 在逻辑层,提供各类 API 来处理各种逻辑
    • 处理数据绑定、组件系统、事件系统、通信系统等一系列框架逻辑

    由于小程序的渲染层和逻辑层是两个线程管理,两个线程各自注入了基础库。小程序的基础库不会被打包在某个小程序的代码包里边,它会被提前内置在微信客户端。这样可以:

    • 降低业务小程序的代码包大小
    • 可以单独修复基础库中的 Bug,无需修改到业务小程序的代码包

    Exparser 框架
    Exparser 是微信小程序的组件组织框架,内置在小程序基础库中,为小程序的各种组件提供基础的支持。小程序内的所有组件,包括内置组件和自定义组件,都由 Exparser 组织管理。Exparser 特点包括:

    1. 基于 Shadow DOM 模型:模型上与 WebComponents 的 ShadowDOM 高度相似,但不依赖浏览器的原生支持,也没有其他依赖库;实现时,还针对性地增加了其他API以支持小程序组件编程。
    2. 可在纯JS环境中运行:这意味着逻辑层也具有一定的组件树组织能力。
    3. 高效轻量:性能表现好,在组件实例极多的环境下表现尤其优异,同时代码尺寸也较小。

    关于基础库和 Exparser 框架,更多的也可以参考:《小程序开发指南》

    结束语


    这节里大概讲了小程序设计中比较重要的一个模型——双线程,关于双线程的出现、设计、数据通信,到基础库、Exparser 框架,都是一个个相关而又相互影响的选择。
    关于小程序的底层框架设计,其实还涉及更多更多我们未能一时半会掌握完的内容,自定义组件、原生组件,还有他们做了很多的性能优化工作,都不是只言片语能讲完的。我们能做的,就是多去思考。

    	<p style="margin-top:50px;">查看Github有更多内容噢:<a href="https://github.com/godbasin">https://github.com/godbasin</a></p>
    </div>
    
    展开全文
  • 微信小程序为什么使用双线程模型

    千次阅读 2019-07-19 11:33:36
    双线程模型 为什么使用双线程模型? 个人理解总结: 小程序的架构设计时,要求渲染快、加载快。渲染页面的技术主要分为三种: 纯客户端原生技术渲染(纯客户端技术需要与微信代码一起编包,跟随微信发布版本,这样的...

    双线程模型

    为什么使用双线程模型?
    个人理解总结:

    小程序的架构设计时,要求渲染快、加载快。渲染页面的技术主要分为三种:

    1. 纯客户端原生技术渲染(纯客户端技术需要与微信代码一起编包,跟随微信发布版本,这样的开发节奏不对);
    2. 纯web技术渲染(纯web技术,那么一些复杂交互页面可能面临一些性能问题,因为Web技术中,UI和JS的脚本在单线程中,这样容易导致逻辑任务抢占UI渲染资源。);
    3. 介于客户端技术和Web技术之间(Hybrid技术)。

    最终选取的是类似微信JSSDK之后这样的HyBrid技术,页面用Web技术渲染,辅之以大量的接口提供丰富的客户端原生能力。同时,每个小程序的页面都是使用不同的WebView渲染。

    如果开发者可以直接通过JS操作界面的DOM树,那么一些敏感数据就毫无安全性可言,故微信提供了一个沙箱的环境来运行开发者的JS代码,这个环境不能有任何的浏览器先关的接口,只能通过JS解释执行环境,类似于HTML5的ServiceWorker启动另一个线程来执行JS。

    但由于小程序是多WebView的架构,所以每一个页面都是不同的WebView渲染显示,所以单独创建了一个线程去执行JS,也就是逻辑层,而界面渲染的任务都在WebView线程里执行(渲染层)。即双线程模型。

    展开全文
  • 在本篇内容中我们给大家分享了易语言实现双线程的方法以及代码解析,需要的朋友们参考下。
  • 双线程JAVA小程序

    2018-09-28 14:25:46
    创建两个线程,每个线程的工作是在自己界面的TextField区域中从左到右动态地显示一个字符串;可通过界面按钮启动和中止每个线程的运行。GUI显示界面可参考下图。
  • 双线程-源码

    2021-02-17 12:55:55
    双线程
  • 《秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据》 http://blog.csdn.net/morewindows/article/details/8646902 配套程序 在《秒杀多线程系列》的前十五篇中介绍多线程的相关概念,多线程同步互斥...
  • TCP读写双线程程序

    2013-10-31 12:46:06
    ubuntu系统下用套接字写的双线程程序,可以实现收发字符功能。对理解线程有帮助。
  • 双线程读写队列数据

    千次阅读 2018-04-28 12:40:56
    MFC对话框中一个按钮的响应函数实现两个功能:显示数据同时处理数据,因此开两个线程,一个线程显示数据(开了一个定时器,响应WM_TIMER消息按照一定时间间隔向TeeChart图表添加数据并显示)同时在队列队尾添加数据...

    MFC对话框中一个按钮的响应函数实现两个功能:
    显示数据同时处理数据,因此开两个线程,一个线程显示数据(开了一个定时器,响应WM_TIMER消息按照一定时间间隔向TeeChart图表添加数据并显示)同时在队列队尾添加数据,另一个线程从该队列队头去数据来处理。


    下面就来解决这个案例。先来分析下

    这个案例是一个线程向队列中的队列头部读取数据,一个线程向队列中的队列尾部写入数据。看起来很像读者写者问题,但其实不然,如果将队列看成缓冲区,这个案例明显是个生产者消费者问题。因此我们仿照生产者消费者的思路来具体分析下案例中的“等待”情况:

        1.     当队列为空时,读取数据线程必须等待写入数据向队列中写入数据。也就是说当队列为空时,读取数据线程要等待队列中有数据

        2.     当队列满时,写入数据线程必须等待读取数据线程向队列中读取数据。也就是说当队列满时,写入数据线程要等待队列中有空位

    访问队列时,需要互斥吗?这将依赖于队列的数据结构实现,如果使用STL中的vector,由于vector会动态增长。因此要做互斥保护。如果使用循环队列,那么读取数据线程拥有读取指针,写入数据线程拥有写入指针,各自将访问队列中不同位置上的数据,因此不用进行互斥保护。

    分析完毕后,再来考虑使用什么样的数据结构。使用两个信号量,一个来记录循环队列中空位的个数,一个来记录循环队列中产品的个数(非空位个数)。

    代码非常容易写出,下面给出完整的源代码。

    #include <stdio.h>  
    #include <process.h>  
    #include <windows.h>  
    #include <time.h>  
    
    #include<iostream>
    #include<iomanip>
    using namespace std;
    
    const int iQueue = 5;
    int arrQueue[iQueue];
    
    int iRead, iWrite, iCnt;
    //关键段
    CRITICAL_SECTION csConsole;//互斥访问控制台
    //信号量
    HANDLE hSemaphoreQueueEmpty;//表示队列中空位
    HANDLE hSemaphoreQueueFull;//表示队列中数据
    
    
    //设置控制台输出颜色  
    //SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);  
    
    
    //读数据线程函数
    UINT WINAPI ReaderProc(PVOID pParam){
    	int iData = 0;
    	while(iData < 20){
    		//等待数据
    		WaitForSingleObject(hSemaphoreQueueFull, INFINITE);
    		iData = arrQueue[iRead];
    		iRead = (iRead+1)%iQueue;
    		EnterCriticalSection(&csConsole);
    		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);  
    		cout << "从队列中读数据" << iData << endl;
    		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);  
    		LeaveCriticalSection(&csConsole);
    		Sleep(rand() % 100);
    		//空闲位+1
    		ReleaseSemaphore(hSemaphoreQueueEmpty, 1, NULL);
    	}
    	return 0;
    }
    
    //写数据线程函数  
    UINT WINAPI WriterProc(PVOID pParam){
    	int iData = 0;
    	while(iData < 20){
    		//等待队列中数据
    		WaitForSingleObject(hSemaphoreQueueEmpty, INFINITE);
    		arrQueue[iWrite] = ++iData;
    		iWrite = (iWrite+1)%iQueue;
    		EnterCriticalSection(&csConsole);
    		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);  
    		cout << "将数据" << iData << "写入队列" << endl;
    		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);  
    		LeaveCriticalSection(&csConsole);
    		Sleep(rand()%100);
    		//数据位+1
    		ReleaseSemaphore(hSemaphoreQueueFull, 1, NULL);
    	}
    	return 0;
    }
    
    //双线程读写队列数据
    void TrTw()
    {
    	//初始化关键段
    	InitializeCriticalSection(&csConsole);
    	//空闲位信号量:初始全为空闲
    	hSemaphoreQueueEmpty = CreateSemaphore(NULL, iQueue, iQueue, NULL);
    	//数据位信号量:初始没有数据
    	hSemaphoreQueueFull = CreateSemaphore(NULL, 0, iQueue, NULL);
    
    	srand(time(NULL));
    	iRead = iWrite = 0;
    	memset(arrQueue, 0, sizeof(int)*iQueue);
    	HANDLE hThreads[2];
    	hThreads[0] = (HANDLE)_beginthreadex(NULL, 0, ReaderProc, NULL, 0, NULL);
    	hThreads[1] = (HANDLE)_beginthreadex(NULL, 0, WriterProc, NULL, 0, NULL);
    	WaitForMultipleObjects(2, hThreads, TRUE, INFINITE);
    	for(int i = 0; i < 2; i++)			CloseHandle(hThreads[i]);
    
    	//销毁关键段和信号量
    	DeleteCriticalSection(&csConsole);
    	CloseHandle(hSemaphoreQueueEmpty);
    	CloseHandle(hSemaphoreQueueFull);
    }
    

    展开全文
  • Qt文字发送双线程

    2013-10-31 12:49:31
    Qt下用QThread类写的双线程程序,可以实现收发字符串,用到了自定义信号和槽。
  • python-opencv多线程

    2019-07-05 09:53:58
    在使用opencv处理视频的过程中,...创建一个自定义的帧缓冲区,开启一个线程使用cap函数读取视频帧,将读取到的视频帧存入我们自定义的缓冲区,这个缓冲区可以设计成固定大小,每次新增新的帧进入缓冲区,将挤掉旧的帧
  • 一个简单的双线程赛马程序,进度条模拟赛马进度
  • 内置双线程聊天窗口(MFC),运用多线程,socket知识,在MFC中构建一个聊天窗口。http://blog.sina.com.cn/zzaiphy
  • 本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5136035 转载请标明出处,原文地址:... ...   在《秒杀多线程系列》的前十五篇中介绍多线程的相关
  • 基于jeremie_SYSU的基础上部署心得,由于是2019,同其不一样,配置方法略有差异,特整理记录,适用VS2019免费版。
  • 基于C++与OpenCV,利用多线程开发技术,实现图像分割、图像分类、文件重命名以及文件过滤等功能,根据CPU支持线程数量进行并发计算。
  • java课上老师要求的小练习,使用的是继承Thread类来实现的。
  • 线程之双线程进行通信 /*编程实现以下功能: 主线程实现以下功能: 定义全局变量key; 创建两个线程; 如果线程正常结束,得到线程的结束状态值,并打印; 线程一完成以下操作: 设置全局变量key的值为字符串...
  • esp32 线程

    2018-07-13 13:09:55
    ESP32支持线程功能,可以利用线程实现多任务。ESP32上线程的用法和pyboard上差不多,都是通过_thread模块。下面演示了线程的基本用法,程序定义了三个线程,一个线程控制LED,另外两个线程打印信息。
  • 基于树莓派3B+的实时多线程人脸haar检测算法。 使用opencv+python编写 操作系统:ubuntu mate 18.04
  • RouterOS 联通电信双线程设置方法 如果你在用RouterOS的话 这个对你肯定很有用了
  • printf(" ---------- 双线程读写队列数据\n"); InitializeCriticalSection(&g_cs); g_hSemaphoreBufferEmpty = CreateSemaphore(NULL ,QUEUE_LEN,QUEUE_LEN,NULL); g_hSemaphoreBufferFull = CreateSemaphore...
  • 蓝桥杯 - 传纸条 (双线程DP)

    千次阅读 2015-05-25 20:43:35
    思路:双线程DP,具体看代码; AC代码: #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define LL long ...
  • Linux多线程实现令牌桶流量控制,内有makefile

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 262,928
精华内容 105,171
关键字:

双线程