• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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]