1e41f4b71Sopenharmony_ci# Worker同步调用主线程的接口
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci如果一个接口在主线程中已经实现了,Worker需要调用该接口,那么可以使用下面这种方式实现。
4e41f4b71Sopenharmony_ci
5e41f4b71Sopenharmony_ci下面以Worker同步调用主线程接口为例进行说明。
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci1. 首先,在主线程实现需要调用的接口,并且创建Worker对象,在Worker上注册需要调用的接口。
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci   ```ts
10e41f4b71Sopenharmony_ci   // IconItemSource.ets
11e41f4b71Sopenharmony_ci   export class IconItemSource {
12e41f4b71Sopenharmony_ci     image: string | Resource = '';
13e41f4b71Sopenharmony_ci     text: string | Resource = '';
14e41f4b71Sopenharmony_ci   
15e41f4b71Sopenharmony_ci     constructor(image: string | Resource = '', text: string | Resource = '') {
16e41f4b71Sopenharmony_ci       this.image = image;
17e41f4b71Sopenharmony_ci       this.text = text;
18e41f4b71Sopenharmony_ci     }
19e41f4b71Sopenharmony_ci   }
20e41f4b71Sopenharmony_ci   ```
21e41f4b71Sopenharmony_ci
22e41f4b71Sopenharmony_ci   ```ts
23e41f4b71Sopenharmony_ci   // WorkerCallGlobalUsage.ets
24e41f4b71Sopenharmony_ci   import worker from '@ohos.worker';
25e41f4b71Sopenharmony_ci   import { IconItemSource } from './IconItemSource';
26e41f4b71Sopenharmony_ci   
27e41f4b71Sopenharmony_ci   // 创建Worker对象
28e41f4b71Sopenharmony_ci   const workerInstance: worker.ThreadWorker = new worker.ThreadWorker("entry/ets/pages/workers/Worker.ts");
29e41f4b71Sopenharmony_ci   
30e41f4b71Sopenharmony_ci   class PicData {
31e41f4b71Sopenharmony_ci     public iconItemSourceList: IconItemSource[] = [];
32e41f4b71Sopenharmony_ci   
33e41f4b71Sopenharmony_ci     public setUp(): string {
34e41f4b71Sopenharmony_ci       for (let index = 0; index < 20; index++) {
35e41f4b71Sopenharmony_ci         const numStart: number = index * 6;
36e41f4b71Sopenharmony_ci         // 此处循环使用6张图片资源
37e41f4b71Sopenharmony_ci         this.iconItemSourceList.push(new IconItemSource('$media:startIcon', `item${numStart + 1}`));
38e41f4b71Sopenharmony_ci         this.iconItemSourceList.push(new IconItemSource('$media:background', `item${numStart + 2}`));
39e41f4b71Sopenharmony_ci         this.iconItemSourceList.push(new IconItemSource('$media:foreground', `item${numStart + 3}`));
40e41f4b71Sopenharmony_ci         this.iconItemSourceList.push(new IconItemSource('$media:startIcon', `item${numStart + 4}`));
41e41f4b71Sopenharmony_ci         this.iconItemSourceList.push(new IconItemSource('$media:background', `item${numStart + 5}`));
42e41f4b71Sopenharmony_ci         this.iconItemSourceList.push(new IconItemSource('$media:foreground', `item${numStart + 6}`));
43e41f4b71Sopenharmony_ci   
44e41f4b71Sopenharmony_ci       }
45e41f4b71Sopenharmony_ci       return "setUpIconItemSourceList success!";
46e41f4b71Sopenharmony_ci     }
47e41f4b71Sopenharmony_ci   }
48e41f4b71Sopenharmony_ci   
49e41f4b71Sopenharmony_ci   let picData = new PicData();
50e41f4b71Sopenharmony_ci   // 在Worker上注册需要调用的对象
51e41f4b71Sopenharmony_ci   workerInstance.registerGlobalCallObject("picData", picData);
52e41f4b71Sopenharmony_ci   workerInstance.postMessage("run setUp in picData");
53e41f4b71Sopenharmony_ci   ```
54e41f4b71Sopenharmony_ci
55e41f4b71Sopenharmony_ci2. 然后,在Worker中通过callGlobalCallObjectMethod接口就可以调用主线程中的setUp()方法了。
56e41f4b71Sopenharmony_ci
57e41f4b71Sopenharmony_ci   ```ts
58e41f4b71Sopenharmony_ci   // Worker.ets
59e41f4b71Sopenharmony_ci   import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
60e41f4b71Sopenharmony_ci   const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
61e41f4b71Sopenharmony_ci   try {
62e41f4b71Sopenharmony_ci     // 调用方法无入参
63e41f4b71Sopenharmony_ci     let res: string = workerPort.callGlobalCallObjectMethod("picData", "setUp", 0) as string;
64e41f4b71Sopenharmony_ci     console.error("worker: ", res);
65e41f4b71Sopenharmony_ci   } catch (error) {
66e41f4b71Sopenharmony_ci     // 异常处理
67e41f4b71Sopenharmony_ci     console.error("worker: error code is " + error.code + " error message is " + error.message);
68e41f4b71Sopenharmony_ci   }
69e41f4b71Sopenharmony_ci   ```
70