文档开发者中心
我的
|

HarmonyOS 5

如何使用TaskPool进行异步IO,同时保证文件写入是顺序的,在上一个ArrayBuffer写完之后再去写下一个?

【设备信息】Mate60
【API版本】Api12
【DevEco Studio版本】5.0.3.700
【问题描述】我们的场景是使用TaskPool进行异步IO,同时保证文件写入是顺序的,在上一个ArrayBuffer写完之后再去写下一个,这能提供一个示例给我们看看吗
点赞
收藏
回复
1
分享
举报
浏览122 发布于2025-02-20 03:20广东
全部评论
最多点赞
最新发布
最早发布
|
技术支持

可以参考以下代码:

收起
自动换行
深色代码主题
复制
import taskpool from '@ohos.taskpool';
import { DataUtil } from './DataUtil'
import fs from '@ohos.file.fs';
@Concurrent
function writeBuf(buf: ArrayBuffer, offset: number, filesDir: string) {
  // 步骤1: 具体的图像处理操作及其他耗时操作
  let fileName = 'test'
  let filePath = `${filesDir}/${fileName}`
  console.info(`Demo start:${offset}`)
  // 新建并打开文件
  let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  fs.writeSync(file.fd, buf, { offset });
  // 关闭文件
  fs.closeSync(file);
  console.info(`Demo end:${offset}`)
}
function histogramStatistic(folderPath: string): void {
  let group: taskpool.TaskGroup = new taskpool.TaskGroup();
  for (let i = 0; i < 3; i++) {
    let buf = DataUtil.fakeDataArray()
    group.addTask(writeBuf, buf, i * buf.byteLength, folderPath);
  }
  taskpool.execute(group, taskpool.Priority.HIGH).then((ret: Object) => {
    console.info(`Demo taskPool task execute success`)
  })
}
@Entry
@Component
struct Index {
  @State message: string = 'Hello World'
  build() {
    Row() {
      Column({ space: 20 }) {
        Button('WriteBuf')
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            const filesDir: string = getContext(this).tempDir
            histogramStatistic(filesDir);
          })
        Button('ReadBuf')
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            const filesDir: string = getContext(this).tempDir
            let filePath = `${filesDir}/test`
            let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE)
            let array = new ArrayBuffer(24)
            fs.readSync(file.fd, array)
            let res = new Uint8Array(array);
            console.info(`Demo res:${JSON.stringify(res)}`)
            for (let i = 0; i < 24; i++) {
              console.info(`Demo ${res[i]}`)
            }
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

DataUtil.ets:

收起
自动换行
深色代码主题
复制
export class DataUtil {
  static fakeDataArray(): ArrayBuffer {
    let buf = new ArrayBuffer(8);
    let res = new Uint8Array(buf);
    res[0] = 1;
    res[1] = 2;
    res[2] = 3;
    res[3] = 4;
    res[4] = 5;
    res[5] = 6;
    res[6] = 7;
    res[7] = 8;
    return buf;
  }
}

taskpool方案:
index.ets

收起
自动换行
深色代码主题
复制
@Concurrent
function writeBuf(filePath: string, buf: ArrayBuffer, offset: number = 0) {
  console.info(`Demo start:${offset}`)
  // 新建并打开文件
  let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  fs.writeSync(file.fd, buf, { offset });
  // 关闭文件
  fs.closeSync(file);
  console.info(`Demo end:${offset}`)
}
export class audioTaskPool {
  private offset: number = 0
  private filePath: string = ''
  private group: taskpool.SequenceRunner = new taskpool.SequenceRunner();
  write(path: string, buff: ArrayBuffer) {
    console.info(`Demo enter write:${path} offset:${this.offset} length:${buff.byteLength}`)
    let length = buff.byteLength
    let task = new taskpool.Task(writeBuf, path, buff, this.offset)
    this.group.execute(task)
    this.offset += length
  }
}
...
private setListener(requestId: string) {
   let pool:audioTaskPool = new audioTaskPool()
   ...
   onData(utteranceId: string, audio: ArrayBuffer, response: textToSpeech.SynthesisResponse) {
       pool.write(filePath, audio)
   }
   ...
}
展开全部
1楼回复于2025-02-24 02:31 来自广东
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要提问题

了解社区公约,与您携手共创和谐专业的开发者社区。