1/* 2 * Copyright (c) 2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16// [Start parent_worker] 17import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker, collections, ArkTSUtils } from '@kit.ArkTS' 18import { CopyEntry } from '../managers/CopyEntry' 19 20const workerPort: ThreadWorkerGlobalScope = worker.workerPort; 21 22// 计算worker1的任务数量 23let count1 = 0; 24// 计算worker2的任务数量 25let count2 = 0; 26// 计算总任务数量 27let sum = 0; 28// 异步锁 29const asyncLock = new ArkTSUtils.locks.AsyncLock(); 30// 创建子Worker 31const copyWorker1 = new worker.ThreadWorker('entry/ets/pages/ChildWorker'); 32const copyWorker2 = new worker.ThreadWorker('entry/ets/pages/ChildWorker'); 33 34workerPort.onmessage = (e : MessageEvents) => { 35 let array = e.data as collections.Array<CopyEntry>; 36 sum = array.length; 37 for (let i = 0; i < array.length; i++) { 38 let entry = array[i]; 39 if (entry.type === 'copy1') { 40 count1++; 41 // 如果是copy1类型,则将数据传递给 copyWorker1 42 copyWorker1.postMessageWithSharedSendable(entry); 43 } else if (entry.type === 'copy2') { 44 count2++; 45 // 如果是copy2类型,则将数据传递给 copyWorker2 46 copyWorker2.postMessageWithSharedSendable(entry); 47 } 48 } 49} 50 51copyWorker1.onmessage = async (e : MessageEvents) => { 52 console.info('copyWorker1 onmessage:' + e.data); 53 await asyncLock.lockAsync(() => { 54 count1--; 55 if (count1 == 0) { 56 // 如果copyWorker1的任务全部完成,则关闭copyWorker1 57 console.info('copyWorker1 close'); 58 copyWorker1.terminate(); 59 } 60 sum--; 61 if (sum == 0) { 62 // 如果所有任务全部完成,则关闭父Worker 63 workerPort.close(); 64 } 65 }) 66} 67 68copyWorker2.onmessage = async (e : MessageEvents) => { 69 console.info('copyWorker2 onmessage:' + e.data); 70 await asyncLock.lockAsync(() => { 71 count2--; 72 sum--; 73 if (count2 == 0) { 74 // 如果copyWorker2的任务全部完成,则关闭copyWorker2 75 console.info('copyWorker2 close') 76 copyWorker2.terminate(); 77 } 78 if (sum == 0) { 79 // 如果所有任务全部完成,则关闭父Worker 80 workerPort.close(); 81 } 82 }) 83} 84 85workerPort.onmessageerror = (e : MessageEvents) => { 86 console.error('onmessageerror:' + e.data); 87} 88 89workerPort.onerror = (e : ErrorEvent) => { 90 console.error('onerror:' + e.message); 91} 92// [End parent_worker]