使用Worker進(jìn)行線程間通信

2024-01-25 12:29 更新

Worker是與主線程并行的獨(dú)立線程。創(chuàng)建Worker的線程被稱為宿主線程,Worker工作的線程被稱為Worker線程。創(chuàng)建Worker時傳入的腳本文件在Worker線程中執(zhí)行,通常在Worker線程中處理耗時的操作,需要注意的是,Worker中不能直接更新Page。

Worker的開發(fā)步驟如下:

  1. 在工程的模塊級build-profile.json5文件的buildOption屬性中添加配置信息。

    1. "buildOption": {
    2. "sourceOption": {
    3. "workers": [
    4. "./src/main/ets/workers/worker.ts"
    5. ]
    6. }
    7. }
  2. 根據(jù)build-profile.json5中的配置創(chuàng)建對應(yīng)的worker.ts文件。

    1. import worker from '@ohos.worker';
    2. let parent = worker.workerPort;
    3. // 處理來自主線程的消息
    4. parent.onmessage = function(message) {
    5. console.info("onmessage: " + message)
    6. // 發(fā)送消息到主線程
    7. parent.postMessage("message from worker thread.")
    8. }
  3. 主線程中使用如下方式初始化和使用worker。

    • Stage模型:

      1. import worker from '@ohos.worker';
      2. let wk = new worker.ThreadWorker("entry/ets/workers/worker.ts");
      3. // 發(fā)送消息到worker線程
      4. wk.postMessage("message from main thread.")
      5. // 處理來自worker線程的消息
      6. wk.onmessage = function(message) {
      7. console.info("message from worker: " + message)
      8. // 根據(jù)業(yè)務(wù)按需停止worker線程
      9. wk.terminate()
      10. }
    • FA模型:

      1. import worker from '@ohos.worker';
      2. let wk = new worker.ThreadWorker("../workers/worker.ts");
      3. // 發(fā)送消息到worker線程
      4. wk.postMessage("message from main thread.")
      5. // 處理來自worker線程的消息
      6. wk.onmessage = function(message) {
      7. console.info("message from worker: " + message)
      8. // 根據(jù)業(yè)務(wù)按需停止worker線程
      9. wk.terminate()
      10. }

說明:

  • build-profile.json5中配置的worker.ts的相對路徑都為./src/main/ets/workers/worker.ts時,在Stage模型下創(chuàng)建worker需要傳入路徑entry/ets/workers/worker.ts;在FA模型下創(chuàng)建worker需要傳入路徑../workers/worker.ts。

  • 主線程與Worker線程間支持的數(shù)據(jù)類型參考序列化支持類型。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號