雷霆击碎黑暗|
HarmonyOS 5
如何使用TaskPool进行异步IO,同时保证文件写入是顺序的,在上一个ArrayBuffer写完之后再去写下一个?
【设备信息】Mate60
【API版本】Api12
【DevEco Studio版本】5.0.3.700
【问题描述】我们的场景是使用TaskPool进行异步IO,同时保证文件写入是顺序的,在上一个ArrayBuffer写完之后再去写下一个,这能提供一个示例给我们看看吗
【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 来自广东
写回答
所见即所得编辑器, editor1
工具栏 撤消 快捷键 Ctrl+Z 重做 快捷键 Ctrl+Y 格式刷 快捷键 Ctrl+Shift+C 清除格式 加粗 快捷键 Ctrl+B 倾斜 快捷键 Ctrl+I 下划线 快捷键 Ctrl+U 删除线格式调整字号 文本颜色 背景颜色 增加缩进量 减少缩进量 左对齐 居中 右对齐 两端对齐段落间距行间距 项目列表 编号列表 插入水平线 块引用 插入/编辑超链接 快捷键 Ctrl+K 取消超链接 图片 表格 上传附件 导入Word 插入代码 MD编辑器 全屏模式
0/50000
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
- 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
- 如您发布的内容为转载内容,请注明内容来源。
我要提问题
相关推荐
换一批
1
HarmonyOS TaskPool是否支持状态管理V2 (API12+)
2
HarmonyOS Taskpool扩容问题(API12+)
3
HarmonyOS glTexSubImage2D是否为异步,具体异步逻辑如何?(API12+)
4
HarmonyOS 文件写入时内容如何换行 (API12+)
5
HarmonyOS 如何使用异步线程来传递ts对象参数(API12+)
6
HarmonyOS 如何解决“Asynchronous operation error”异步操作错误,确保异步操作正确执行和回调? (API12+)
7
HarmonyOS 通过 ArkTS,如何优雅地处理异步操作?是否有类似 async/await 的机制来简化异步调用?(API12+)
8
HarmonyOS 如果在更新数据时使用了异步操作(如网络请求),可能会导致数据更新和界面渲染的时机不同步。确保在异步操作完成后,如何使用setState或其他状态管理方法来更新界面(API12+)
了解社区公约,与您携手共创和谐专业的开发者社区。




































苏公安网备 32011402010933号