# Calculator **Repository Path**: open-harmony-north/calculator ## Basic Information - **Project Name**: Calculator - **Description**: 本例通过计算器 Demo 演示 Worker 的基本用法。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-08-08 - **Last Updated**: 2022-08-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 计算器 Demo 本例通过计算器 Demo 演示 Worker 的基本用法,效果如下所示: ![success](./asserts/screenshot_success.png) ![failure](./asserts/screenshot_failure.png) ## 使用说明 - IDE: ``` DevEco Studio 3.0 Beta4 Build Version: 3.0.0.992, built on July 14, 2022 Runtime version: 11.0.13+7-b1751.21 amd64 VM: Dynamic Code Evolution 64-Bit Server VM by JetBrains s.r.o. Windows 10 10.0 GC: G1 Young Generation, G1 Old Generation Memory: 1536M Cores: 8 Registry: external.system.auto.import.disabled=true ``` - SDK:v3.2.5.5 - Model: Stage(API 9) ## 目录介绍 关键目录介绍: ```shell ├─entry │ │ │ └─src │ ├─main │ │ │ module.json5 │ │ │ │ │ ├─ets │ │ │ ├─Application │ │ │ │ MyAbilityStage.ts │ │ │ │ │ │ │ ├─MainAbility │ │ │ │ MainAbility.ts │ │ │ │ │ │ │ ├─pages │ │ │ │ index.ets # 界面逻辑 │ │ │ │ │ │ │ ├─utils │ │ │ │ calculate.ts # 计算器逻辑 │ │ │ │ logger.ts # 日志封装 │ │ │ │ message.ts # Worker线程与UI主线程之间通信的消息格式 │ │ │ │ │ │ │ └─workers │ │ │ worker.ts # Worker逻辑 │ │ │ │ │ └─resources # 资源目录 ``` ## UI主线程 ```typescript import worker from '@ohos.worker'; @Entry @Component struct Index { // 创建Worker线程,并指定线程中要运行的代码 private workerInstance = new worker.Worker("/entry/ets/workers/worker.ts", { name: "CalculateWorker" }) aboutToAppear() { // 监听从Worker线程传递过来的数据,并进行业务逻辑处理 this.workerInstance.onmessage = (event: MessageEvent) => { // 业务逻辑处理 logger.success(`UI Process receives message: ${JSON.stringify(event.data)}`) if (isSuccess(event.data)) { this.answer = event.data.payload as string; this.hasError = false; } else { this.hasError = true; } } } } ``` ## Worker线程 ```typescript import worker, { MessageEvent } from '@ohos.worker'; import { parse, transform, calculate } from "../utils/calculate"; import { message, CODE_SUCCESS, CODE_FAILURE } from "../utils/message"; import logger from "../utils/logger"; const parentPort = worker.parentPort; // 监听从UI主线程传递过来的数据 parentPort.onmessage = function (event: MessageEvent) { const expression = event.data; logger.success(`Worker Process receives request: ${event.data}`); try { // 业务逻辑处理 const answer: string = calculate(transform(parse(expression))).toString(); logger.success(`Worker Process ponst message: ${answer}`); // 将处理好的结果传递会UI主线程 parentPort.postMessage(message(CODE_SUCCESS, answer)); } catch (err) { logger.error(`Worker Process error: ${err}`); // 异常情况也需要通知UI主线程 parentPort.postMessage(message(CODE_FAILURE)); } } ```