HarmonyOS 鸿蒙Next:taskpool结合emitter,实现主线程和多个子线程之间的通信

发布于 1周前 作者 h691938207 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:taskpool结合emitter,实现主线程和多个子线程之间的通信

在这个示例中,我们创建了两个子线程,分别实现了每隔200毫秒计数器加一,并向主线程发送一条数据,同时更新主界面的UI

1719992671203.jpg

通过taskpool创建并发任务

cke_33235.png

通过emitter实现在主线程中向子线程发送消息

cke_77537.png

在子线程中通过信号变量控制任务的执行

cke_94478.png

完整代码如下:

Index.ets

import emitter, { sleep, event1, event2 } from ‘…/common/Event’
import { taskpool } from ‘@kit.ArkTS’;
import router from ‘@ohos.router’;

@Entry @Component struct Index { @State count1: number = 0; @State count2: number = 0;

build() { Row() { Column({ space: 20 }) { Text(任务<span class="hljs-number">1</span>: ${<span class="hljs-keyword">this</span>.count1}).fontSize(30) Text(任务<span class="hljs-number">2</span>: ${<span class="hljs-keyword">this</span>.count2}).fontSize(30)

    Button(<span class="hljs-string">"开始所有任务"</span>).onClick(() =&gt; {
      run(event1, (count: number) =&gt; <span class="hljs-keyword">this</span>.count1 = count)
      run(event2, (count: number) =&gt; <span class="hljs-keyword">this</span>.count2 = count)
    })
    <span class="hljs-comment">// 向子线程1发送事件</span>
    Button(<span class="hljs-string">"停止任务1"</span>).onClick(() =&gt; emitter.emit(event1));
    <span class="hljs-comment">// 向子线程2发送事件</span>
    Button(<span class="hljs-string">"停止任务2"</span>).onClick(() =&gt; emitter.emit(event2))

  
  }.width(<span class="hljs-string">'100%'</span>)
}.height(<span class="hljs-string">'80%'</span>)

} }

// 启动任务 function run(event: emitter.InnerEvent, callback: Function) { let task: taskpool.Task = new taskpool.Task(taskFunc, event); // 分发任务 taskpool.execute(task); // 接收子线程的数据 task.onReceiveData(callback); }

@Concurrent async function taskFunc(event: emitter.InnerEvent) { // 声明信号变量来控制任务的执行,注意,这个信号变量必须声明在@Concurrent函数内部 let signal: boolean = false; // 订阅事件,通过emitter控制信号 emitter.on(event, () => signal = true); for (let i = 0; i < 100; i++) { // 信号为真时停止任务 if (signal) return; // 向主线程发送消息 taskpool.Task.sendData(i); // 睡200ms await sleep(200) } }

<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

common/Event.ets

import emitter from ‘@ohos.events.emitter’;
const event1: emitter.InnerEvent = {
eventId: 1,
priority: emitter.EventPriority.HIGH
}
const event2: emitter.InnerEvent = {
eventId: 2,
priority: emitter.EventPriority.HIGH
}
const sleep: (ms: number) => Promise<void> = (ms) => new Promise(resolve => setTimeout(resolve, ms));

export { sleep, event1, event2 }; export default emitter;<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

1 回复

在HarmonyOS鸿蒙Next中,利用taskpool结合emitter实现主线程与多个子线程之间的通信,可以遵循以下原理进行开发:

taskpool作为任务调度器,能够高效地管理任务的分发与执行,包括在主线程与子线程之间调度任务。emitter则作为事件发射器,用于在不同线程间传递事件或消息。

  1. 主线程创建emitter:在主线程中初始化emitter对象,用于事件的发送和接收。

  2. 子线程执行任务并监听emitter:在taskpool中分配子线程任务,子线程通过emitter监听主线程或其他子线程的事件。

  3. 主线程通过emitter发送事件:当主线程需要与子线程通信时,通过emitter发送事件,包含必要的数据或指令。

  4. 子线程处理事件:子线程接收到事件后,根据事件类型和数据执行相应的逻辑处理。

  5. 子线程通过emitter反馈结果(可选):如果子线程需要向主线程反馈处理结果,同样可以通过emitter发送事件。

实现过程中,需确保线程安全,避免数据竞争和死锁等问题。HarmonyOS提供了丰富的API和工具,有助于开发者高效地实现多线程通信。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部