广州天极营销型网站,h5网站页面设计,宁波市住房和城乡建设局网站,开发一个软件需要什么过程【HarmonyOS Next】鸿蒙应用进程和线程详解
一、前言 进程的定义#xff1a; 进程是系统进行资源分配的基本单位#xff0c;是操作系统结构的基础。 在鸿蒙系统中#xff0c;一个应用下会有三类进程#xff1a; (1) 主进程#xff0c; (2) ExtensionAbility进程#xff…【HarmonyOS Next】鸿蒙应用进程和线程详解
一、前言 进程的定义 进程是系统进行资源分配的基本单位是操作系统结构的基础。 在鸿蒙系统中一个应用下会有三类进程 (1) 主进程 (2) ExtensionAbility进程同一种类型的ExtensionAbility会放在一个进程里。例如FromExtensionAbility创建了两个也会在同一个进程里。【ExtensionAbility详情参见官方链接ExtensionAbility组件】 (3) WebView渲染进程用于网页容器渲染的进程。【这种设计提升了鸿蒙系统中arkWeb的网页容器渲染能力】 线程的定义 线程是操作系统进行运算调度的基本单位是进程中的执行流共享进程的资源。 鸿蒙系统中以主进程举例会有三种类型的线程 1主线程 2TaskPool Worker线程 3Worker线程 后两者用于创建多线程TaskPool Worker主要用于处理轻量级的耗时任务。Worker用于偏重的耗时任务。
二、进程处理 进程的创建 如上图所示三方应用可以创建XXExtensionAbility的形式增加应用内的进程。但是Webview渲染进程和主进程的是不能创建增加。 跨进程通信 鸿蒙系统目前提供了两种方式实现跨进程通信公共事件和Emitter。这两个方案外startAbility也可传递一些信息。
公共事件主要是监听系统的事件分为系统公共事件和自定义事件。三方应用主要通过自定义事件来通信。
import { commonEventManager } from kit.BasicServicesKit;
import { BusinessError } from kit.BasicServicesKit;// 定义订阅者用于保存创建成功的订阅者对象后续使用其完成订阅及退订的动作
let subscriber: commonEventManager.CommonEventSubscriber;
// 订阅者信息
let subscribeInfo: commonEventManager.CommonEventSubscribeInfo {events: [event]
};
// 创建订阅者回调
function createCB(err: BusinessError, commonEventSubscriber: commonEventManager.CommonEventSubscriber) {if (err ! null) {console.error(Failed to create subscriber. Code is ${err.code}, message is ${err.message});} else {console.info(Succeeded in creating subscriber);subscriber commonEventSubscriber;}
}
// 创建订阅者
commonEventManager.createSubscriber(subscribeInfo, createCB);Emitter的使用类似于EventHub只不过在这个基础上多了传递包裹的封装添加了优先级和序号。也新增了once监听一次的接口而已。
Sendable
class Sample {constructor() {this.count 100;}printCount() {console.info(Print count : this.count);}count: number;
}let callback (eventData: emitter.GenericEventDataSample): void {let storage: Sample eventData.data!;storage.printCount();
}
// 收到eventId为eventId的事件后执行回调函数
emitter.on(eventId, callback);三、线程处理 1.线程的创建和线程间通信 如上所说可以使用TaskPool Worker 和 Worker创建线程。并且配套会有双向通信的接口。 需要注意的是前者有性能要求太过于耗时的操作例如超过三分钟就会无条件失败这种耗时任务就要使用后者Worker来实现。不过后者又因为消耗系统资源一个应用只能创建八个。
TaskPool Worker
Concurrent
function printArgs(args: number): number {console.info(printArgs: args);return args;
}taskpool.execute(printArgs, 100).then((value: Object) { // 100: test numberconsole.info(taskpool result: value);
});Worker
// Worker.ets
import { worker, MessageEvents, ErrorEvent } from kit.ArkTS;// 创建worker线程中与宿主线程通信的对象
const workerPort worker.workerPort// worker线程接收宿主线程信息
workerPort.onmessage (e: MessageEvents): void {// data宿主线程发送的信息let data: number e.data;// 往收到的buffer里写入数据const view new Int8Array(data).fill(3);// worker线程向宿主线程发送信息workerPort.postMessage(view);
}// worker线程发生error的回调
workerPort.onerror (err: ErrorEvent) {console.log(worker.ets onerror err.message);
}// Index.ets
import { worker, MessageEvents, ErrorEvent } from kit.ArkTS;Entry
Component
struct Index {State message: string Hello World;build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold).onClick(() {// 宿主线程中创建Worker对象const workerInstance new worker.ThreadWorker(entry/ets/workers/Worker.ets);// 宿主线程向worker线程传递信息const buffer new ArrayBuffer(8);workerInstance.postMessage(buffer, [buffer]);// 宿主线程接收worker线程信息workerInstance.onmessage (e: MessageEvents): void {// dataworker线程发送的信息let data: number e.data;console.info(main thread data is data);// 销毁Worker对象workerInstance.terminate();}// 在调用terminate后执行onexitworkerInstance.onexit (code) {console.log(main thread terminate);}workerInstance.onerror (err: ErrorEvent) {console.log(main error message err.message);}})}.width(100%).height(100%)}}
}2.线程内通信 EventHubGlobalThis单例AppStorage。都可实现线程内UI界面UIAbility和业务类之间的通信。