diff --git a/zh-cn/application-dev/arkts-utils/arkts-async-lock-introduction.md b/zh-cn/application-dev/arkts-utils/arkts-async-lock-introduction.md index 6a84ef931d3248167026badb54d92b32af443b06..383c01073c24724bc7a9cb254a8d8ec69c694ab0 100644 --- a/zh-cn/application-dev/arkts-utils/arkts-async-lock-introduction.md +++ b/zh-cn/application-dev/arkts-utils/arkts-async-lock-introduction.md @@ -1,18 +1,18 @@ # 异步锁 -为了解决多线程并发实例间的数据竞争问题,ArkTS引入了异步锁能力。异步锁可能会被类对象持有,因此为了更方便地在并发实例间获取同一个异步锁对象,[AsyncLock对象](../reference/apis-arkts/arkts-apis-arkts-utils-locks.md#asynclock)支持跨线程引用传递。 +为了解决多线程并发实例间的数据竞争问题,ArkTS引入了异步锁。异步锁可以被类对象持有,因此为了方便在并发实例间获取同一个异步锁对象,[AsyncLock对象](../reference/apis-arkts/js-apis-arkts-utils.md#asynclock)支持跨线程引用传递。 -由于ArkTS语言支持异步操作,阻塞锁容易产生死锁问题,因此在ArkTS中仅支持异步锁(非阻塞式锁)。同时,异步锁还可以用于保证单线程内的异步任务时序一致性,防止异步任务时序不确定导致的同步问题。 +阻塞锁容易产生死锁问题,因此在ArkTS中仅支持异步锁(非阻塞式锁)。同时,异步锁还可以用于保证单线程内的异步任务时序一致性,防止死锁问题。 更多异步锁相关接口,请参见[异步锁ArkTSUtils.locks](../reference/apis-arkts/arkts-apis-arkts-utils-locks.md)。 > **说明:** > -> 使用异步锁的方法需标记为async,调用时需用await修饰,以确保时序正确。 +> 使用异步锁的方法需标记为async,调用时需用await修饰,以确保时序一致性。。 ## 使用示例 -为了防止[@Sendable共享对象](arkts-sendable.md)在不同线程修改共享变量导致的竞争问题,可以使用异步锁保护数据。示例如下: +为了防止[@Sendable共享对象](arkts-sendable.md)在不同线程中修改共享变量导致的竞争问题,可以使用异步锁保护数据。示例如下: ```ts import { ArkTSUtils, taskpool } from '@kit.ArkTS'; diff --git a/zh-cn/application-dev/arkts-utils/arkts-collections-introduction.md b/zh-cn/application-dev/arkts-utils/arkts-collections-introduction.md index 0dc1a9a597b839d1a38ef8c9c2e5e29ffa9bad65..e5641c1849172e3d0502d2bd47c97e0a90966239 100644 --- a/zh-cn/application-dev/arkts-utils/arkts-collections-introduction.md +++ b/zh-cn/application-dev/arkts-utils/arkts-collections-introduction.md @@ -2,9 +2,9 @@ ## ArkTS容器集 -ArkTS共享容器([@arkts.collections (ArkTS容器集)](../reference/apis-arkts/js-apis-arkts-collections.md))是一种在并发实例间共享传输的容器类,可以用于并发场景下的高性能数据传递。功能与Ecmascript262规范定义的容器类似,但仍然有部分差异,具体可见[共享容器与原生API方法的行为差异对比](#共享容器与原生api方法的行为差异对比)。 +ArkTS共享容器([@arkts.collections (ArkTS容器集)](../reference/apis-arkts/js-apis-arkts-collections.md))是一种在并发实例间共享传输的容器类,用于并发场景下的高性能数据传递。它的功能与Ecmascript262规范定义的容器类似,但存在部分差异,具体可见[共享容器与原生API方法的行为差异对比](#共享容器与原生api方法的行为差异对比)。 -ArkTS共享容器在多个并发实例间传递时,默认采用引用传递,允许多个并发实例操作同一个容器实例。此外,还支持拷贝传递,即每个并发实例拥有一个独立的ArkTS容器实例。 +ArkTS共享容器在多个并发实例间传递时,默认采用引用传递,允许多个并发实例操作同一容器实例。此外,还支持拷贝传递,即每个并发实例拥有独立的ArkTS容器实例。 ArkTS共享容器不是线程安全的,内部使用了fail-fast(快速失败)机制,即当检测到多个并发实例同时对容器进行结构性修改时,会触发异常。因此,在多线程场景下修改容器内属性时,开发者需要使用ArkTS提供的[异步锁](arkts-async-lock-introduction.md)机制保证ArkTS容器的安全访问。 @@ -61,17 +61,17 @@ struct Index { ## 共享容器与原生API方法的行为差异对比 -ArkTS提供了Sendable数据相关的共享容器集,接口行为与原生API存在部分差异,具体可见下文对比。 +ArkTS提供了Sendable数据相关的共享容器集,接口行为与原生API存在部分差异,具体见下文对比。 > **说明:** > -> ArkTS共享容器的类型与Ecmascript262规范定义的原生容器的类型不同,因此使用原生容器Array的isArray()方法判断collections.Array实例对象会返回false。 +ArkTS共享容器的类型与Ecmascript 262规范定义的原生容器类型不同,因此使用原生容器Array的isArray()方法判断collections.Array实例对象会返回false。 > -> ArkTS共享容器跨线程传递采用引用传递方式,与原生容器相比效率更高,如果开发者需要跨线程传输的数据量很大,建议使用ArkTS共享容器。 +>ArkTS共享容器采用引用传递方式跨线程传递,与原生容器相比效率更高。如果需要跨线程传输大量数据,建议使用ArkTS共享容器。 ### Array -支持原生容器Array通过[collections.Array.from](../reference/apis-arkts/js-apis-arkts-collections.md#from)方法转换为ArkTS Array容器;支持通过原生容器Array的from方法将ArkTS Array容器转换为原生容器Array。 +支持通过collections.Array.from(../reference/apis-arkts/js-apis-arkts-collections.md#from)方法将原生容器 Array 转换为 ArkTS Array 容器;支持通过原生容器 Array 的from方法将 ArkTS Array容器转换为原生容器Array。 | 原生API方法 | ArkTS容器集方法 | 是否有行为差异 | 在ArkTS容器中的差异表现 | | -------- | -------- | -------- | -------- | @@ -128,7 +128,7 @@ ArkTS提供了Sendable数据相关的共享容器集,接口行为与原生API ### TypedArray(以Int8Array为例) -支持原生容器TypedArray通过[collections.TypedArray.from](../reference/apis-arkts/js-apis-arkts-collections.md#from-1)方法转换为ArkTS TypedArray容器;支持通过原生容器TypedArray的from方法将ArkTS TypedArray容器转换为原生容器TypedArray。 +支持通过collections.TypedArray.from(../reference/apis-arkts/js-apis-arkts-collections.md#from-1)方法将原生容器TypedArray转换为ArkTS TypedArray容器;也支持通过原生容器 TypedArray的from方法将ArkTS TypedArray容器转换为原生容器TypedArray。 | 原生API方法 | ArkTS容器集方法 | 是否有行为差异 | 在ArkTS容器中的差异表现 | | -------- | -------- | -------- | -------- | @@ -137,16 +137,16 @@ ArkTS提供了Sendable数据相关的共享容器集,接口行为与原生API | readonly byteOffset: number | readonly byteOffset: number | 否 | / | | readonly length: number | readonly length: number | 否 | / | | readonly BYTES_PER_ELEMENT: number | static readonly BYTES_PER_ELEMENT: number | 否 | / | -| copyWithin(target: number, start: number, end?: number): this | copyWithin(target: number, start: number, end?: number): Int8Array | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | -| every(predicate: (value: number, index: number, array: Int8Array) => unknown, thisArg?: any): boolean | every(predicate: TypedArrayPredicateFn<number, Int8Array>): boolean | 是 | 1. 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
2. ArkTS不支持this,因此不支持thisArg参数。 | -| fill(value: number, start?: number, end?: number): this | fill(value: number, start?: number, end?: number): Int8Array | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | -| filter(predicate: (value: number, index: number, array: Int8Array) => any, thisArg?: any): Int8Array | filter(predicate: TypedArrayPredicateFn<number, Int8Array>): Int8Array | 是 | 1. 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
2. ArkTS不支持this,因此不支持thisArg参数。 | -| find(predicate: (value: number, index: number, obj: Int8Array) => boolean, thisArg?: any): number \| undefined | find(predicate: TypedArrayPredicateFn<number, Int8Array>): number \| undefined | 是 | 1. 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
2. ArkTS不支持this,因此不支持thisArg参数。 | +| copyWithin(target: number, start: number, end?: number): this| copyWithin(target: number, start: number, end?: number): Int8Array | 是 | 在遍历或访问过程中,不允许进行元素的增、删、改操作,否则会抛出异常。 | +| every(predicate: (value: number, index: number, array: Int8Array) => unknown, thisArg?: any): boolean | every(predicate: TypedArrayPredicateFn<number, Int8Array>): boolean | 是 | 1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
2. ArkTS不支持this,因此不支持thisArg参数。 | +| fill(value: number, start?: number, end?: number): this | fill(value: number, start?: number, end?: number): Int8Array | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。 | +| filter(predicate: (value: number, index: number, array: Int8Array) => any, thisArg?: any): Int8Array | filter(predicate: TypedArrayPredicateFn<number, Int8Array>): Int8Array | 是 | 1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
2. ArkTS不支持this,因此不支持thisArg参数。 | +| find(predicate: (value: number, index: number, obj: Int8Array) => boolean, thisArg?: any): number \| undefined | find(predicate: TypedArrayPredicateFn<number, Int8Array>): number \| undefined | 是 | 1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
2. ArkTS不支持this,因此不支持thisArg参数。 | | findIndex(predicate: (value: number, index: number, obj: Int8Array) => boolean, thisArg?: any): number | findIndex(predicate: TypedArrayPredicateFn<number, Int8Array>): number | 是 | ArkTS不支持this,因此不支持thisArg参数。 | -| forEach(callbackfn: (value: number, index: number, array: Int8Array) => void, thisArg?: any): void | forEach(callbackFn: (value: number, index: number, array: Int8Array) => void): void | 是 | 1. 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
2. ArkTS不支持this,因此不支持thisArg参数。 | +| forEach(callbackfn: (value: number, index: number, array: Int8Array) => void, thisArg?: any): void | forEach(callbackFn: (value: number, index: number, array: Int8Array) => void): void | 是 | 1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
2. ArkTS不支持this,因此不支持thisArg参数。 | | indexOf(searchElement: number, fromIndex?: number): number | indexOf(searchElement: number, fromIndex?: number): number | 否 | / | | join(separator?: string): string | join(separator?: string): string | 否 | / | -| map(callbackfn: (value: number, index: number, array: Int8Array) => number, thisArg?: any): Int8Array | map(callbackFn: TypedArrayForEachCallback<number, Int8Array>): Int8Array | 是 | 1. 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
2. ArkTS不支持this,因此不支持thisArg参数。 | +| map(callbackfn: (value: number, index: number, array: Int8Array) => number, thisArg?: any): Int8Array | map(callbackFn: TypedArrayForEachCallback<number, Int8Array>): Int8Array | 是 | 1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
2. ArkTS不支持this,因此不支持thisArg参数。 | | reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number): number | reduce(callbackFn: TypedArrayReduceCallback<number, number, Int8Array>): number | 否 | / | | reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue: number): number | reduce(callbackFn: TypedArrayReduceCallback<number, number, Int8Array>, initialValue: number): number | 否 | / | | reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U | reduce<U>(callbackFn: TypedArrayReduceCallback<U, number, Int8Array>, initialValue: U): U | 否 | / | @@ -154,8 +154,8 @@ ArkTS提供了Sendable数据相关的共享容器集,接口行为与原生API | set(array: ArrayLike<number>, offset?: number): void | set(array: ArrayLike<number>, offset?: number): void | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | | slice(start?: number, end?: number): Int8Array | slice(start?: number, end?: number): Int8Array | 否 | / | | some(predicate: (value: number, index: number, array: Int8Array) => unknown, thisArg?: any): boolean | some(predicate: TypedArrayPredicateFn<number, Int8Array>): boolean | 是 | ArkTS不支持this,因此不支持thisArg参数。 | -| sort(compareFn?: (a: number, b: number) => number): this | sort(compareFn?: TypedArrayCompareFn<number>): Int8Array | 是 | 1. 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
2. 继承场景下,无法获得实际类型的返回值。 | -| subarray(begin?: number, end?: number): Int8Array | subarray(begin?: number, end?: number): Int8Array | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | +| sort(compareFn?: (a: number, b: number) => number): this | sort(compareFn?: TypedArrayCompareFn<number>): Int8Array | 是 | 1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
2. 继承场景下,无法获得实际类型的返回值。 | +| subarray(begin?: number, end?: number): Int8Array | subarray(begin?: number, end?: number): Int8Array | 是 | 在遍历或访问过程中,禁止对元素进行增、删、改操作,否则将抛出异常。 | | [index: number]: number | [index: number]: number | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | | entries(): IterableIterator<[number, number]> | entries(): IterableIterator<[number, number]> | 否 | / | | keys(): IterableIterator<number> | keys(): IterableIterator<number> | 否 | / | @@ -169,23 +169,23 @@ ArkTS提供了Sendable数据相关的共享容器集,接口行为与原生API | from<T>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => number, thisArg?: any): Int8Array | static from<T>(arrayLike: ArrayLike<T>, mapFn: TypedArrayFromMapFn<T, number>): Int8Array | 是 | ArkTS不支持this,因此不支持thisArg参数。 | | from(arrayLike: Iterable<number>, mapfn?: (v: number, k: number) => number, thisArg?: any): Int8Array | static from(arrayLike: Iterable<number>, mapFn?: TypedArrayFromMapFn<number, number>): Int8Array | 是 | ArkTS不支持this,因此不支持thisArg参数。 | | of(...items: number[]): Int8Array | static of(...items: number[]): Int8Array | 否 | / | -| toString(): string | toString(): string | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | -| toLocaleString(): string | toLocaleString(): string | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | -| lastIndexOf(searchElement: number, fromIndex?: number): number | lastIndexOf(searchElement: number, fromIndex?: number): number | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | -| reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number): number | reduceRight(callbackFn: TypedArrayReduceCallback<number, number, Int8Array>): number | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | -| reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U | reduceRight<U = number>(callbackFn: TypedArrayReduceCallback<U, number, Int8Array>, initialValue: U): U | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | +| toString(): string | toString(): string | 是 | 在遍历、访问过程中,禁止对元素进行增、删、改操作,否则将抛出异常。 | +| toLocaleString(): string | toLocaleString(): string | 是 | 在遍历或访问过程中,禁止对元素进行增、删、改操作,否则将抛出异常。 | +| lastIndexOf(searchElement: number, fromIndex?: number): number | lastIndexOf(searchElement: number, fromIndex?: number): number | 是 | 在遍历或访问过程中,禁止进行元素的增、删、改操作,否则将抛出异常。 | +| reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number): number | reduceRight(callbackFn: TypedArrayReduceCallback): number | 是 | 遍历、访问过程中禁止增、删、改操作,否则将抛出异常。 | +| reduceRight\(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U | reduceRight\(callbackFn: TypedArrayReduceCallback\, initialValue: U): U | 是 | 在遍历和访问过程中,不允许对元素进行增、删、改操作,否则会抛出异常。 | ### Map | 原生API方法 | ArkTS容器集方法 | 是否有行为差异 | 在ArkTS容器中的差异表现 | | -------- | -------- | -------- | -------- | -| readonly size: number | readonly size: number | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | -| clear(): void | clear(): void | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | -| delete(key: K): boolean | delete(key: K): boolean | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | -| forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): void | forEach(callbackFn: (value: V, key: K, map: Map<K, V>) => void): void | 是 | 1. 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
2. ArkTS不支持this,因此不支持thisArg参数。 | -| get(key: K): V \| undefined | get(key: K): V \| undefined | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | -| has(key: K): boolean | has(key: K): boolean | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | -| set(key: K, value: V): this | set(key: K, value: V): Map<K, V> | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | +| readonly size: number | readonly size: number | 是 | 不允许在遍历或访问过程中进行元素的增、删、改操作,否则会抛出异常。 | +| clear(): void | clear(): void | 是 | 不允许在遍历或访问过程中进行元素的增、删、改操作,否则会抛出异常。 | +| delete(key: K): boolean | delete(key: K): boolean | 是 | 不允许在遍历或访问过程中进行元素的增、删、改操作,否则会抛出异常。 | +| forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): void | forEach(callbackFn: (value: V, key: K, map: Map<K, V>) => void): void | 是 | 1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
2. ArkTS不支持this,因此不支持thisArg参数。 | +| get(key: K): V \| undefined | get(key: K): V \| undefined | 是 | 不允许在遍历或访问过程中对元素进行增、删、改操作,否则将抛出异常。 | +| has(key: K): boolean | has(key: K): boolean | 是 | 在遍历或访问过程中,不允许对元素进行增加、删除或修改操作,否则会抛出异常。 | +| set(key: K, value: V): this | set(key: K, value: V): Map | 是 | 在遍历或访问过程中,不允许对元素进行增、删、改操作,否则会抛出异常。 | | entries(): IterableIterator<[K, V]> | entries(): IterableIterator<[K, V]> | 否 | / | | keys(): IterableIterator<K> | keys(): IterableIterator<K> | 否 | / | | values(): IterableIterator<V> | values(): IterableIterator<V> | 否 | / | @@ -196,12 +196,12 @@ ArkTS提供了Sendable数据相关的共享容器集,接口行为与原生API | 原生API方法 | ArkTS容器集方法 | 是否有行为差异 | 在ArkTS容器中的差异表现 | | -------- | -------- | -------- | -------- | | readonly size: number | readonly size: number | 是 | Sendable类和接口中不允许使用计算属性名称(arkts-sendable-compated-prop-name)。 | -| add(value: T): this | add(value: T): Set<T> | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | -| clear(): void | clear(): void | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | -| delete(value: T): boolean | delete(value: T): boolean | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | -| forEach(callbackfn: (value: T, value2: T, set: Set<T>) => void, thisArg?: any): void | forEach(callbackFn: (value: T, value2: T, set: Set<T>) => void): void | 是 | 1. 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。
2. ArkTS不支持this,因此不支持thisArg参数。 | -| has(value: T): boolean | has(value: T): boolean | 是 | 不允许在遍历、访问过程中进行元素的增、删、改操作否则会抛出异常。 | +| add(value: T): this | add(value: T): Set<T> | 是 | 不允许在遍历或访问过程中进行元素的增、删、改操作,否则会抛出异常。 | +| clear(): void | clear(): void | 是 | 不允许在遍历或访问过程中进行元素的增、删、改操作,否则会抛出异常。 | +| delete(value: T): boolean | delete(value: T): boolean | 是 | 不允许在遍历或访问过程中进行元素的增、删、改操作,否则会抛出异常。 | +| forEach(callbackfn: (value: T, value2: T, set: Set<T>) => void, thisArg?: any): void | forEach(callbackFn: (value: T, value2: T, set: Set<T>) => void): void | 是 | 1. 不允许在遍历、访问过程中进行元素的增、删、改操作,否则会抛出异常。
2. ArkTS不支持this,因此不支持thisArg参数。 | +| has(value: T): boolean | has(value: T): boolean | 是 | 不允许在遍历或访问过程中进行元素的增、删、改操作,否则会抛出异常。 | | entries(): IterableIterator<[T, T]> | entries(): IterableIterator<[T, T]> | 否 | / | | keys(): IterableIterator<T> | keys(): IterableIterator<T> | 否 | / | -| values(): IterableIterator<T> | values(): IterableIterator<T> | 是 | Sendable类和接口中不允许使用计算属性名称(arkts-sendable-compated-prop-name)。 | -| new <T = any>(values?: readonly T[] \| null): Set<T> | constructor(values?: readonly T[] \| null) | 是 | 构造时传入的数据必须是Sendable类型,否则编译会报错。 | +| values(): IterableIterator | values(): IterableIterator | 是 | Sendable 类和接口中不允许使用计算属性名称(arkts-sendable-compated-prop-name)。 | +| new <T = any>(values?: readonly T[] \| null): Set<T> | constructor(values?: readonly T[] \| null) | 是 | 构造时传入的数据必须为Sendable类型,否则将导致编译错误。 | diff --git a/zh-cn/application-dev/arkts-utils/arkts-condition-variable-introduction.md b/zh-cn/application-dev/arkts-utils/arkts-condition-variable-introduction.md index c8c3ce76e567f8673f10e43d27ee0cf33b3f453e..6c47199e7214b05fd4d110641a81d31f967265ed 100644 --- a/zh-cn/application-dev/arkts-utils/arkts-condition-variable-introduction.md +++ b/zh-cn/application-dev/arkts-utils/arkts-condition-variable-introduction.md @@ -1,12 +1,12 @@ # 异步等待 -ArkTS引入了异步等待通知能力,以解决多线程任务时序控制问题。异步等待通知[ConditionVariable](../reference/apis-arkts/arkts-apis-arkts-utils-locks.md#conditionvariable18)对象支持跨线程引用传递。 +ArkTS引入了异步任务的等待和被唤醒能力,以解决多线程任务时序控制问题。异步任务的等待和被唤醒[ConditionVariable](../reference/apis-arkts/js-apis-arkts-utils.md#conditionvariable18)对象支持跨线程引用传递。 -由于ArkTS语言支持异步操作,现在增加了异步任务的等待和被唤醒功能。当收到唤醒通知或等待超时后,异步任务将继续执行。 +ArkTS语言支持异步操作,现已增加异步任务的等待和唤醒功能。当异步任务收到唤醒通知或等待超时后,将继续执行。 > **说明:** > -> 使用异步等待的方法需标记为async,调用时需用await修饰,以确保时序正确。 +使用异步方法需标记为async,调用时需用await修饰,确保时序正确。 ## 使用示例 diff --git a/zh-cn/application-dev/arkts-utils/arkts-sendable-module.md b/zh-cn/application-dev/arkts-utils/arkts-sendable-module.md index 74f84745ea20419c375989737b0f01cda7d6f8de..0523f7f31406cb199febdd40cdd9ce05c2c76061 100644 --- a/zh-cn/application-dev/arkts-utils/arkts-sendable-module.md +++ b/zh-cn/application-dev/arkts-utils/arkts-sendable-module.md @@ -2,14 +2,14 @@ 共享模块是进程内只会加载一次的模块,使用"use shared"这一指令来标记一个模块是否为共享模块。 -非共享模块在同一线程内只加载一次,而在不同线程中会加载多次,每个线程都会生成新的模块对象。因此,目前只能使用共享模块来实现进程单例。 +非共享模块在同一线程内只加载一次,而在不同线程中会多次加载,每个线程都会生成新的模块对象。因此,目前只能使用共享模块实现进程单例。 ## 约束限制 - "use shared"需要与"use strict"一样写在ArkTS文件顶层,写在import语句之后其他语句之前。 - 共享属性不具备传递性。非共享模块A即使引入了共享模块B,模块A也不会因此变成共享模块。 +共享属性不具备传递性。非共享模块A即使引入了共享模块B,也不会因此变成共享模块。 - 共享模块只支持ets文件。 @@ -27,7 +27,7 @@ - 共享模块导出的变量必须是可共享对象。 - 共享模块在并发实例间可共享,因此共享模块导出的所有对象必须是可共享的,可共享对象参考[Sendable支持的数据类型](arkts-sendable.md#sendable支持的数据类型)。 + 共享模块在并发实例间可共享,因此导出的所有对象必须是可共享的。可共享对象参考[Sendable支持的数据类型](arkts-sendable.md#sendable支持的数据类型)。 - 共享模块不允许直接导出模块。 @@ -46,9 +46,9 @@ ``` -- 共享模块可以引用共享模块或非共享模块。共享模块的引用和被引用场景没有限制。 +- 共享模块可以引用其他共享模块或非共享模块,引用和被引用场景没有限制。 -- 仅支持使用静态加载、napi_load_module或napi_load_module_with_info加载共享模块。 + 仅支持使用静态加载、napi_load_module或napi_load_module_with_info加载共享模块。 ```ts // test.ets import { num } from './A'; // 支持静态加载 diff --git a/zh-cn/application-dev/arkts-utils/ason-parsing-generation.md b/zh-cn/application-dev/arkts-utils/ason-parsing-generation.md index f4bc5a93e1a9274071f5b9c323c8360377cb61cc..2138db9b4788b48eb19a0f8af2e83ea956457683 100644 --- a/zh-cn/application-dev/arkts-utils/ason-parsing-generation.md +++ b/zh-cn/application-dev/arkts-utils/ason-parsing-generation.md @@ -6,7 +6,7 @@ ASON.stringify方法还支持将Map和Set对象转换为字符串,可转换的 > **说明:** > -> ASON.parse默认生成的对象为Sendable对象,布局不可变,不支持增删属性。如果需要支持返回对象的布局可变,可以指定返回类型为MAP,此时会全部返回[collections.Map](../reference/apis-arkts/js-apis-arkts-collections.md#collectionsmap)对象,支持增删属性。 +> ASON.parse默认生成的对象为Sendable对象,布局不可变,不支持增删属性。如果需要支持返回对象的布局可变,可以指定返回类型为Map,此时会全部返回[collections.Map](../reference/apis-arkts/js-apis-arkts-collections.md#collectionsmap)对象,支持增删属性。 ## 使用示例 diff --git a/zh-cn/application-dev/arkts-utils/batch-database-operations-guide.md b/zh-cn/application-dev/arkts-utils/batch-database-operations-guide.md index e404fde9fc5dda5622139782b542242f3b3cce86..1ea95c5a094fcf7d0a82fbafac19c516546d0f83 100644 --- a/zh-cn/application-dev/arkts-utils/batch-database-operations-guide.md +++ b/zh-cn/application-dev/arkts-utils/batch-database-operations-guide.md @@ -8,7 +8,7 @@ 1. 创建多个子任务,支持数据库的创建、插入、查询和清除等操作。 -2. UI主线程调用子任务,完成数据库的增删改查等操作。 +2. UI主线程发起,在子线程完成数据库的增删改查等操作。 ```ts // Index.ets @@ -142,9 +142,9 @@ struct Index { ## 使用Sendable进行大容量数据库操作 -由于数据库数据跨线程传递存在耗时,数据量较大时会占用UI主线程。推荐使用Sendable封装数据库数据,以降低跨线程开销。 +由于跨线程传递数据库数据会占用UI主线程,特别是在数据量较大时。推荐使用Sendable封装数据库数据,以减少跨线程开销。 -1. 定义数据库中的数据格式,可以使用Sendable,以减少跨线程操作的耗时。 +1. 创建数据库中的数据格式,可以使用Sendable,以减少跨线程操作的耗时。 ```ts // SharedValuesBucket.ets @@ -172,7 +172,7 @@ struct Index { ``` -2. UI主线程发起,在子线程进行数据的增删改查等操作。 +2. UI主线程发起,在子线程完成数据的增删改查等操作。 ```ts // Index.ets @@ -314,11 +314,11 @@ struct Index { ## 复杂类实例对象使用Sendable进行大容量数据库操作 -普通类实例对象的属性可持有Sendable类实例对象。 +普通类实例对象不仅可持有Sendable类实例对象,还支持跨线程操作。 -对于复杂的普通类实例对象,可以先将相应数据库数据字段封装为Sendable类实例对象,再由普通类实例对象持有,从而降低跨线程开销。 +对于复杂的类实例对象,可以先将相应数据库数据字段封装为Sendable类实例对象,再由类实例对象持有,从而降低跨线程开销。 -1. 定义数据库中的数据格式,可采用Sendable,减少跨线程耗时。 +1. 定义数据库中的数据格式,采用Sendable,减少跨线程耗时。 ```ts // SharedValuesBucket.ets @@ -345,7 +345,7 @@ struct Index { } ``` -2. 定义普通类实例对象,持有Sendable类实例对象。 +2. 定义复杂类实例对象,持有Sendable类实例对象。 ```ts // Material.ets diff --git a/zh-cn/application-dev/arkts-utils/concurrent-loading-modules-guide.md b/zh-cn/application-dev/arkts-utils/concurrent-loading-modules-guide.md index c8280852bb08d87e71cdb90ce599b9aa8d1d0a8a..f5033958346674368aa7471c725ec5a9308d65ed 100644 --- a/zh-cn/application-dev/arkts-utils/concurrent-loading-modules-guide.md +++ b/zh-cn/application-dev/arkts-utils/concurrent-loading-modules-guide.md @@ -1,10 +1,10 @@ # 业务模块并发加载场景 -在应用启动过程中,会有多个业务模块需要加载,例如地图类应用的定位、打车、导航等不同的模块,如果全部在UI主线程初始化,则会严重影响应用冷启动耗时。此时需要在不同子线程并行化加载这些业务模块,降低启动耗时。 +在应用启动时,多个业务模块需要加载,例如地图应用中的定位、打车、导航等模块。如果全部在UI主线程初始化,会严重影响冷启动时间。此时,应在不同子线程中并行加载这些模块,以降低启动耗时。 通过使用ArkTS提供的TaskPool能力,可以将不同的业务初始化任务移到子线程中。业务模块可通过下沉C++实现为[NativeBinding对象](transferabled-object.md)或在ArkTS层定义为[Sendable对象](arkts-sendable.md),从而将初始化的模块返回给UI主线程调用,实现如下。 -1. 各业务功能(SDK)模块定义(这里以Sendable对象为例)。 +1. 各业务功能(SDK)模块定义(示例中使用Sendable对象)。 计算器业务模块定义如下: ```ts @@ -65,7 +65,7 @@ ``` - 定时器业务模块定义如下: + 定时器业务模块的定义如下: ```ts // sdk/TimerSdk.ets diff --git a/zh-cn/application-dev/arkts-utils/cpu-intensive-task-development.md b/zh-cn/application-dev/arkts-utils/cpu-intensive-task-development.md index ffb8321373b7bcbeda024081664fe92d4b947048..b8f2bb272d2dc441a9f1d3b4bcf6da2831d696d4 100644 --- a/zh-cn/application-dev/arkts-utils/cpu-intensive-task-development.md +++ b/zh-cn/application-dev/arkts-utils/cpu-intensive-task-development.md @@ -1,25 +1,25 @@ # CPU密集型任务开发指导 (TaskPool和Worker) -CPU密集型任务是指需要占用系统资源进行大量计算的任务,这类任务需要长时间运行,会阻塞线程中其他事件的处理,因此不适宜在UI主线程中进行。例如图像处理、视频编码、数据分析等。 +CPU密集型任务需要占用大量系统资源进行计算,长时间运行会阻塞线程中的其他事件处理,不适宜在UI主线程中进行。例如图像处理、视频编码、数据分析。 基于多线程并发机制处理CPU密集型任务可以提高CPU利用率,提升应用程序响应速度。 -当任务不需要长时间(3分钟)占据后台线程,而是一个个独立的任务时,推荐使用TaskPool,反之推荐使用Worker。 +当任务不需要长时间(3分钟)占用后台线程,而是一个个独立的任务时,推荐使用TaskPool,反之推荐使用Worker。 接下来将分别以图像直方图处理和后台长时间模型预测任务为例进行说明。 ## 使用TaskPool进行图像直方图处理 -1. 实现图像处理的业务逻辑。 +1. 开发者实现图像处理的业务逻辑。 -2. 数据分段,通过任务组发起关联任务调度。 +2. 开发者对数据进行分段,并通过任务组发起关联任务调度。 创建[TaskGroup](../reference/apis-arkts/js-apis-taskpool.md#taskgroup10),通过[addTask()](../reference/apis-arkts/js-apis-taskpool.md#addtask10)添加对应的任务,然后通过[execute()](../reference/apis-arkts/js-apis-taskpool.md#taskpoolexecute10)执行任务组,并指定为[高优先级](../reference/apis-arkts/js-apis-taskpool.md#priority)。在当前任务组所有任务结束后,会将直方图处理结果同时返回。 -3. 结果数组汇总处理。 +3. 开发者汇总处理结果数组。 ```ts import { taskpool } from '@kit.ArkTS'; @@ -76,7 +76,7 @@ struct Index { 本文通过某地区提供的房价数据训练一个简易的房价预测模型,该模型支持通过输入房屋面积和房间数量去预测该区域的房价,模型需要长时间运行,房价预测需要使用前面的模型运行结果,因此需要使用Worker。 -1. DevEco Studio提供了Worker创建的模板,新建一个Worker线程,例如命名为“MyWorker”。 +1. DevEco Studio提供了Worker创建的模板,创建一个Worker线程,例如命名为“MyWorker”。 ![newWorker](figures/newWorker.png) @@ -89,7 +89,7 @@ struct Index { const workerInstance: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/MyWorker.ets'); ``` -3. 在宿主线程中通过调用[onmessage()](../reference/apis-arkts/js-apis-worker.md#onmessage9)方法接收Worker线程发送过来的消息,并通过调用[postMessage()](../reference/apis-arkts/js-apis-worker.md#postmessage9)方法向Worker线程发送消息。 +3. 开发者在宿主线程中通过调用[onmessage()](../reference/apis-arkts/js-apis-worker.md#onmessage9)方法接收Worker线程发送过来的消息,并通过调用[postMessage()](../reference/apis-arkts/js-apis-worker.md#postmessage9)方法向Worker线程发送消息。 例如,向Worker线程发送训练和预测的消息,并接收Worker线程发送回来的消息。 ```ts @@ -123,7 +123,7 @@ struct Index { let workerPort: ThreadWorkerGlobalScope = worker.workerPort; ``` -5. 在Worker线程中通过调用[onmessage()](../reference/apis-arkts/js-apis-worker.md#onmessage9-1)方法接收宿主线程发送的消息,并通过调用[postMessage()](../reference/apis-arkts/js-apis-worker.md#postmessage9-2)方法向宿主线程发送消息。 +5. 开发者在Worker线程中通过调用[onmessage()](../reference/apis-arkts/js-apis-worker.md#onmessage9-1)方法接收宿主线程发送的消息,并通过调用[postMessage()](../reference/apis-arkts/js-apis-worker.md#postmessage9-2)方法向宿主线程发送消息。 例如,在Worker线程中定义预测模型及其训练过程,并与宿主线程进行信息交互。 ```ts @@ -162,7 +162,7 @@ struct Index { ``` -6. 在Worker线程中完成任务之后,执行Worker线程销毁操作。销毁线程的方式主要有两种:根据需要可以在宿主线程中对Worker线程进行销毁;也可以在Worker线程中主动销毁Worker线程。 +6. 开发者在Worker线程中完成任务后,可以执行销毁操作。销毁方式有两种:一是在宿主线程中销毁Worker线程;二是在Worker线程中主动销毁。 在宿主线程中通过调用[onexit()](../reference/apis-arkts/js-apis-worker.md#onexit9)方法定义Worker线程销毁后的处理逻辑。 diff --git a/zh-cn/application-dev/arkts-utils/global-configuration-guide.md b/zh-cn/application-dev/arkts-utils/global-configuration-guide.md index 0074b47f60e3820ce42d6e077b4f6d32632f8ce4..0b2f05f61ecf9c82786459706b53901ef963fac4 100644 --- a/zh-cn/application-dev/arkts-utils/global-configuration-guide.md +++ b/zh-cn/application-dev/arkts-utils/global-configuration-guide.md @@ -1,8 +1,8 @@ # 全局配置项功能场景 -对于需要使用进程单例的场景,例如不同并发实例间需要数据保持一致的全局配置项业务,可以采用共享模块来实现。 +对于需要使用进程单例的场景,例如不同并发实例间需要数据保持一致的全局配置项功能,可以采用共享模块来实现。 -以下示例展示了只有在Wi-Fi打开且用户登录的情况下才能进行下载的业务功能,具体步骤如下。 +以下示例展示了只有在Wi-Fi打开且用户登录的情况下才能进行下载的功能,具体步骤如下。 1. 编写全局配置文件。 diff --git a/zh-cn/application-dev/arkts-utils/independent-time-consuming-task.md b/zh-cn/application-dev/arkts-utils/independent-time-consuming-task.md index b69d6e1924e44fd1e1b775430c68aafe6f474883..caa148ef3bf8869746b9ec0308ec5cb20f5e1fa7 100644 --- a/zh-cn/application-dev/arkts-utils/independent-time-consuming-task.md +++ b/zh-cn/application-dev/arkts-utils/independent-time-consuming-task.md @@ -1,6 +1,6 @@ # 使用TaskPool执行独立的耗时任务 -对于独立运行的耗时任务,任务执行完毕后将结果返回给宿主线程,没有上下文依赖,可采用以下方式实现。 +对于独立运行的耗时任务,任务完成后将结果返回给宿主线程。可采用以下方式实现。 下面通过图片加载来说明。 @@ -28,7 +28,7 @@ @Concurrent export function loadPicture(count: number): IconItemSource[] { let iconItemSourceList: IconItemSource[] = []; - // 遍历添加6*count个IconItem的数据 + // 遍历添加6*count个IconItem的数据,每个IconItem包含图片和文本信息。 for (let index = 0; index < count; index++) { const numStart: number = index * 6; // 此处循环使用6张图片资源 @@ -44,7 +44,7 @@ ``` -2. 使用TaskPool中的execute方法执行上述任务,加载图片。 +2. 使用TaskPool的execute方法执行任务,加载图片。 ```ts // Index.ets diff --git a/zh-cn/application-dev/arkts-utils/io-intensive-task-development.md b/zh-cn/application-dev/arkts-utils/io-intensive-task-development.md index f7b4519daf8b18d94c2112f03e5bf90e58d6a29f..2b03e2529e4263a3756e46b4c8917e357cd00700 100644 --- a/zh-cn/application-dev/arkts-utils/io-intensive-task-development.md +++ b/zh-cn/application-dev/arkts-utils/io-intensive-task-development.md @@ -1,7 +1,7 @@ # I/O密集型任务开发指导 (TaskPool) -使用异步并发可以解决单次I/O任务阻塞的问题,但如果遇到I/O密集型任务,同样会阻塞线程中其它任务的执行,这时需要使用多线程并发能力来进行解决。 +使用异步并发可以解决单次I/O任务阻塞的问题。对于I/O密集型任务,若线程中的其他任务仍可能被阻塞,建议采用多线程并发来处理。 I/O密集型任务的性能关键在于I/O操作的速度和效率,而非CPU的处理能力。这类任务需要频繁进行磁盘读写和网络通信。此处通过频繁读写系统文件来模拟I/O密集型并发任务的处理。 @@ -12,7 +12,7 @@ I/O密集型任务的性能关键在于I/O操作的速度和效率,而非CPU // write.ets import { fileIo } from '@kit.CoreFileKit' - // 定义并发函数,内部密集调用I/O能力 + // 定义并发函数,内部频繁调用I/O能力 // 写入文件的实现 export async function write(data: string, filePath: string): Promise { let file: fileIo.File = await fileIo.open(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE); diff --git a/zh-cn/application-dev/arkts-utils/long-time-task-guide.md b/zh-cn/application-dev/arkts-utils/long-time-task-guide.md index 6433fe02c03e1fedbf729f0f29e1a91e20c10ccd..c2067b862cffea8c2e5a63eb9ffa1bf8b3fd3b15 100644 --- a/zh-cn/application-dev/arkts-utils/long-time-task-guide.md +++ b/zh-cn/application-dev/arkts-utils/long-time-task-guide.md @@ -1,10 +1,10 @@ # 长时任务开发指导(TaskPool) -此处提供使用TaskPool进行长时任务的开发指导,以定期采集传感器数据为例。 +此处提供使用TaskPool进行长时任务开发的指导,以定期采集传感器数据为例。 ## 使用TaskPool进行传感器数据监听 -1. 导入需要用到的模块。 +1. 导入所需的模块。 ```ts // Index.ets diff --git a/zh-cn/application-dev/arkts-utils/long-time-task-overview.md b/zh-cn/application-dev/arkts-utils/long-time-task-overview.md index 301fff4f2a6270935fecd5980d7e892d9da2032c..130ba430125bfc431f3da4138e6fb50544d5ccf8 100644 --- a/zh-cn/application-dev/arkts-utils/long-time-task-overview.md +++ b/zh-cn/application-dev/arkts-utils/long-time-task-overview.md @@ -1,13 +1,13 @@ # 长时任务并发场景简介 -在应用业务实现过程中,对于需要较长时间不定时运行的任务,称为长时任务。如果在UI主线程中执行这些长时任务,会阻塞UI主线程的UI业务,导致卡顿和丢帧等问题,影响用户体验。因此,通常需要将这些独立的长时任务放到单独的子线程中执行。 +在应用业务实现过程中,需要较长时间不定时运行的任务称为长时任务。如果在UI主线程中执行这些长时任务,会阻塞UI业务,导致卡顿和丢帧等问题,影响用户体验。因此,通常将这些独立的长时任务放到子线程中执行。 -典型的长时任务场景如下所示: +典型的长时任务场景包括: | 常见业务场景 | 具体业务描述 | | -------- | -------- | -| 定期采集传感器数据 | 周期性采集一些传感器信息(例如位置信息、速度传感器等),应用需要长时间不间断的运行。 | +| 周期性采集传感器数据 | 周期性采集一些传感器信息(例如位置信息、速度传感器等),应用需要长时间不间断的运行。 | | 监听Socket端口信息 | 长时间监听Socket数据,不定时需要响应处理。 | -上述业务场景均为独立的长时任务,任务执行周期长,与外部交互简单。分发到后台线程后,这些任务需要不定期响应以获取结果。这些类型的任务使用TaskPool可以简化开发工作量,避免管理复杂的生命周期,避免线程泛滥。开发者只需要将上述独立的长时任务放入TaskPool队列,再等待结果即可。 +上述业务场景均为独立的长时任务,任务执行周期长,与外部交互简单。分发到后台线程后,这些任务需要不定期响应以获取结果。使用TaskPool可以简化开发工作量,避免管理复杂的生命周期,避免线程泛滥。开发者只需要将上述独立的长时任务放入TaskPool队列,再等待结果即可。 diff --git a/zh-cn/application-dev/arkts-utils/makeobserved-sendable.md b/zh-cn/application-dev/arkts-utils/makeobserved-sendable.md index 4dec6b213521d4b90878f359a7bbecd5d9114340..bea46ed23d2e05de8baa91ba60c04694bda7dd8f 100644 --- a/zh-cn/application-dev/arkts-utils/makeobserved-sendable.md +++ b/zh-cn/application-dev/arkts-utils/makeobserved-sendable.md @@ -1,11 +1,11 @@ # ArkUI数据更新场景 -当需要网络下载或者本地生成的数据需要发送到UI线程进行展示时,由于ArkUI的标注和[\@Sendable装饰器](../arkts-utils/arkts-sendable.md#sendable装饰器)不能同时修饰变量和对象,因此需要使用[makeObserved](../ui/state-management/arkts-new-makeObserved.md)在ArkUI中导入可观察的Sendable共享数据。 +当需要网络下载或者本地生成的数据需要发送到UI线程进行展示时,由于ArkUI的装饰器[\@Sendable装饰器](../arkts-utils/arkts-sendable.md#sendable装饰器)不能同时修饰变量和对象,因此需要使用[makeObserved](../ui/state-management/arkts-new-makeObserved.md)在ArkUI中导入可观察的Sendable共享数据。 本示例说明以下场景: -- makeObserved在传入@Sendable类型的数据后有观察能力,且其变化可以触发UI刷新。 -- 从子线程获取数据,然后整体替换UI线程的可观察数据。 -- 从子线程获取的数据重新执行makeObserved,将数据变为可观察数据。 +- makeObserved在传入@Sendable类型的数据后有观察能力,且其变化可以触发UI更新。 +- 从子线程获取数据,整体替换UI线程的可观察数据。 +- 从子线程获取的数据重新执行makeObserved,变为可观察数据。 - 将数据从UI主线程传递回子线程时,只传递不可观察的数据。makeObserved的返回值不能直接传给子线程。 ```ts diff --git a/zh-cn/application-dev/arkts-utils/multi-thread-cancel-task.md b/zh-cn/application-dev/arkts-utils/multi-thread-cancel-task.md index f06b369c4fe3e7c8c307fc6fb54efc8d245a5e1d..7d8f77a1839324c029c5bcb2a1097cc8f60ff325 100644 --- a/zh-cn/application-dev/arkts-utils/multi-thread-cancel-task.md +++ b/zh-cn/application-dev/arkts-utils/multi-thread-cancel-task.md @@ -1,6 +1,6 @@ # 多线程取消TaskPool任务场景 -由于任务池[TaskPool](../reference/apis-arkts/js-apis-taskpool.md)的任务对象[Task](../reference/apis-arkts/js-apis-taskpool.md#task)不支持跨线程传递,因此无法在子线程中取消任务。从 API version 18 开始,Task新增了[任务ID](../reference/apis-arkts/js-apis-taskpool.md#属性)属性,支持通过任务ID在子线程中取消任务。以下示例提供多线程取消已提交给TaskPool中的任务开发指导,开发者可将已创建任务的任务ID存储在[Sendable对象](./arkts-sendable.md)中,需要取消任务时,通过Sendable对象来多线程取消任务。 +由于任务池[TaskPool](../reference/apis-arkts/js-apis-taskpool.md)的任务对象[Task](../reference/apis-arkts/js-apis-taskpool.md#task)不支持跨线程传递,无法在子线程中直接取消任务。从 API version 18 开始,Task新增了任务[任务ID](../reference/apis-arkts/js-apis-taskpool.md#属性)属性,支持通过任务ID在子线程中取消任务。以下示例提供多线程取消已提交给 TaskPool的任务的开发指导。开发者可将已创建任务的任务ID存储在[Sendable对象](./arkts-sendable.md)中,需要取消任务时,通过Sendable对象在子线程中取消任务。 1. 定义一个Sendable类,在类属性中存储任务ID。 diff --git a/zh-cn/application-dev/arkts-utils/native-interthread-shared.md b/zh-cn/application-dev/arkts-utils/native-interthread-shared.md index b55c499066a695c25069073db9679dff53c50fc9..0bd3e8a35b4c38f9ed3223bb30bc797e6ff5c712 100644 --- a/zh-cn/application-dev/arkts-utils/native-interthread-shared.md +++ b/zh-cn/application-dev/arkts-utils/native-interthread-shared.md @@ -1,13 +1,13 @@ # C++线程间数据共享场景 -当应用在C++层进行多线程并发计算时,因为ArkTS的API需要在ArkTS环境中执行,为了避免在非UI主线程每次回调时等待UI主线程的API调用结果,需要在这些C++线程上创建ArkTS执行环境并直接调用API。此外,可能需要在C++线程之间共享和操作Sendable对象。 +在C++层进行多线程并发计算时,需要在每个C++线程上创建ArkTS执行环境,直接调用API。这样可以避免在非UI主线程回调时等待UI主线程的API调用结果。同时,还需要在C++线程之间共享和操作Sendable对象。 -为了支持此类场景,C++线程需具备创建调用ArkTS的能力,并对Sendable对象进行多线程共享和操作。 +为了支持此类场景,C++线程需要能够创建并调用ArkTS,同时支持对Sendable对象进行多线程共享和操作。 ## 在C++线程上调用ArkTS能力 -关于如何使用Node-API接口在C++线程创建ArkTS运行环境并调用,开发者可以参考[使用Node-API接口创建ArkTS运行时环境](../napi/use-napi-ark-runtime.md)。 +使用Node-API接口在C++线程中创建ArkTS运行环境并调用的方法,可以参考[使用Node-API接口创建ArkTS运行时环境](../napi/use-napi-ark-runtime.md)。 核心代码片段如下所示: @@ -75,11 +75,11 @@ static void *CreateArkRuntimeFunc(void *arg) ``` -主要步骤包括:创建执行环境、加载模块、查找并调用模块函数(也可以直接通过Node-API接口创建Sendable对象),最后销毁执行环境。关于第二步加载模块的详细信息,请参见[使用Node-API接口进行模块加载](../napi/use-napi-load-module-with-info.md)。关于第三步查找并调用函数及更多Node-API接口能力,请参见[Node-API](../reference/native-lib/napi.md#node-api)。 +主要步骤包括:创建执行环境、加载模块、查找并调用模块函数(或直接通过Node-API接口创建Sendable对象),最后销毁执行环境。加载模块的详细信息,请参见[使用Node-API接口进行模块加载](../napi/use-napi-load-module-with-info.md)。查找并调用函数及更多Node-API接口能力,请参见[Node-API](../reference/native-lib/napi.md#node-api)。 ## 在C++线程之间操作Sendable共享对象 -实现在C++调用ArkTS能力后,需要通过序列化和反序列化跨线程传递。napi_value不是多线程安全的,不能直接在多线程之间共享。 +在C++中调用ArkTS能力后,需要通过序列化和反序列化跨线程传递。napi_value不是多线程安全的,不能直接在多线程之间操作和共享。 下面代码例子说明了如何序列化和反序列化传递对象,注意因为Sendable共享对象是引用传递,所以序列化不会产生另外一份拷贝数据,而是直接传递对象引用到反序列化线程,所以在性能上相比非Sendable对象的序列化和反序列化更为高效。 @@ -252,7 +252,7 @@ struct Index { 整个过程主要包括的逻辑实现为: -1. 在入口main函数所在的UI主线程中创建ArkTS运行环境,并发起一个C++子线程创建Sendable对象,保存到result中,然后将result引用的Sendable对象序列化到全局序列化数据serializationData中。 +1. 在UI主线程中创建ArkTS运行环境,并发起一个C++子线程创建Sendable对象,保存到result中,然后将result引用的Sendable对象序列化到全局序列化数据serializationData中。 2. 当这些流程完成后,发起另外一个C++子线程,并在这个新的线程中创建ArkTS运行环境。然后再通过反序列化接口从serializationData中反序列化出UI主线程创建的Sendable对象,并保存到result中,从而实现了Sendable对象的跨C++线程传递。反序列化完成后,需要销毁反序列化数据避免内存泄露。这时UI主线程和子线程都同时持有这个Sendable共享对象,即可通过Node-API进行对象操作,比如读写或者传递到ArkTS层等。 diff --git a/zh-cn/application-dev/arkts-utils/resident-task-guide.md b/zh-cn/application-dev/arkts-utils/resident-task-guide.md index cb34bd5bb4f7550b38f9df5832dc3374d59d7cf0..c7b49c2396e3fb159a696c2510ef8dd8f754e482 100644 --- a/zh-cn/application-dev/arkts-utils/resident-task-guide.md +++ b/zh-cn/application-dev/arkts-utils/resident-task-guide.md @@ -1,12 +1,12 @@ # 常驻任务开发指导(Worker) -提供使用Worker进行常驻任务的开发指导。Worker将持续执行任务,直到宿主线程发送终止指令。 +使用Worker进行常驻任务开发。Worker会持续执行任务,直到宿主线程发送终止指令。 开发过程和示例如下: -1. DevEco Studio支持一键生成Worker,在对应的{moduleName}目录下任意位置,点击鼠标右键 > New > Worker,即可自动生成Worker的模板文件及配置信息。本文以创建“Worker”为例。 +1. DevEco Studio支持一键生成Worker,在对应的{moduleName}目录下任意位置,单击鼠标右键 > New > Worker,即可自动生成Worker的模板文件及配置信息。本文以创建“Worker”为例。 - 此外,还支持手动创建Worker文件,具体方式和相关注意事项请参见[创建Worker的注意事项](worker-introduction.md#创建worker的注意事项)。 +此外,还支持手动创建Worker文件。具体方式和注意事项请参见[创建Worker的注意事项](worker-introduction.md#创建worker的注意事项)。 2. 导入Worker模块。 @@ -15,7 +15,7 @@ import { worker } from '@kit.ArkTS'; ``` -3. 在宿主线程中通过调用ThreadWorker的[constructor()](../reference/apis-arkts/js-apis-worker.md#constructor9)方法创建Worker对象,当前线程为宿主线程。 +3. 在宿主线程中通过调用ThreadWorker的[constructor()](../reference/apis-arkts/js-apis-worker.md#constructor9)方法创建Worker对象,创建Worker对象的线程为宿主线程。 ```ts // Index.ets diff --git a/zh-cn/application-dev/arkts-utils/resident-task-overview.md b/zh-cn/application-dev/arkts-utils/resident-task-overview.md index 3a908a82fa9b229cd3b11126b0df4b2ad2b68224..9ce8c7fe01e2264cb454dd67be91e0c2613e8b48 100644 --- a/zh-cn/application-dev/arkts-utils/resident-task-overview.md +++ b/zh-cn/application-dev/arkts-utils/resident-task-overview.md @@ -1,10 +1,10 @@ # 常驻任务并发场景简介 -在应用业务实现过程中,对于耗时较长(超过3分钟)且并发量不大的常驻任务场景,建议使用Worker在后台线程中执行这些耗时操作,从而避免阻塞UI主线程,防止出现丢帧、卡顿等影响用户体验的问题。 +在应用业务实现中,对于耗时较长(超过3分钟)且并发量较小的常驻任务,建议使用Worker在后台线程中执行这些操作,以避免阻塞UI主线程,防止出现丢帧、卡顿等影响用户体验的问题。 -常驻任务是指相比于短时任务,时间更长的任务,可能跟UI主线程生命周期一致。相比于长时任务,常驻任务更倾向于跟线程绑定的任务,单次运行时间更长(比如超过3分钟)。 +常驻任务是指时间较长的任务,可能跟UI主线程生命周期一致。相比于短时任务,常驻任务更倾向于跟线程绑定的任务,单次运行时间更长(比如超过3分钟)。 -对应常驻任务,较为常见的业务场景如下: +对于常驻任务,较为常见的业务场景如下: | 常见业务场景 | 具体业务描述 | | -------- | -------- | diff --git a/zh-cn/application-dev/arkts-utils/sendable-freeze.md b/zh-cn/application-dev/arkts-utils/sendable-freeze.md index 574f5c1818bc3bee54e59c7d00b85f6c3a026b6a..48b4a628af559cc54729c15b891bf5664b27de32 100644 --- a/zh-cn/application-dev/arkts-utils/sendable-freeze.md +++ b/zh-cn/application-dev/arkts-utils/sendable-freeze.md @@ -1,10 +1,10 @@ # Sendable对象冻结 -Sendable对象支持冻结操作,冻结后的对象变成只读对象,不能增删改属性,因此在多个并发实例间访问均不需要加锁,可以通过调用[Object.freeze](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze)接口冻结对象。 +Sendable对象支持冻结操作。冻结后,对象变为只读,不能增删改属性。因此,多个并发实例间访问时无需加锁。可以通过调用[Object.freeze](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze)接口冻结对象。 > **说明:** > -> 不支持在.ets文件中使用Object.freeze接口。 +> .ets文件不支持Object.freeze接口。 ## 使用示例 @@ -18,7 +18,7 @@ Sendable对象支持冻结操作,冻结后的对象变成只读对象,不能 ``` -2. 调用freeze方法冻结对象,然后将对象发送到子线程。 +2. 调用freeze方法冻结对象,然后发送到子线程。 ```ts // Index.ets @@ -57,7 +57,7 @@ Sendable对象支持冻结操作,冻结后的对象变成只读对象,不能 ``` -3. 子线程不加锁直接操作对象。 +3. 子线程直接操作对象,不加锁。 ```ts // Worker.ets diff --git a/zh-cn/application-dev/arkts-utils/sendable-guide.md b/zh-cn/application-dev/arkts-utils/sendable-guide.md index 80ff3493dd0716652b9d33da1886736f1f0597b1..3f89855b61bd966e81339d653abefb1dd71ead50 100644 --- a/zh-cn/application-dev/arkts-utils/sendable-guide.md +++ b/zh-cn/application-dev/arkts-utils/sendable-guide.md @@ -1,5 +1,5 @@ # Sendable使用场景 -Sendable对象在不同并发实例间默认的传递方式为引用传递,相比序列化方式更高效,同时不会丢失class上携带的成员方法。因此,Sendable可以解决两个关键场景的问题: +Sendable对象在不同并发实例间默认采用引用传递,这种方式比序列化更高效,且不会丢失类成员方法。因此,Sendable能够解决两个关键场景的问题: - 跨并发实例传输大数据(例如达到100KB以上的数据)。 @@ -7,7 +7,7 @@ Sendable对象在不同并发实例间默认的传递方式为引用传递,相 ## 跨并发实例传输大数据场景 -由于跨并发实例序列化的开销随数据量线性增长,因此当传输数据量较大时(100KB的数据传输耗时约为1ms),跨并发实例的拷贝开销会影响应用性能。使用引用传递方式传输对象可提升性能。 +跨并发实例序列化的开销随数据量线性增长。当传输数据量较大时,例如100KB的数据传输耗时约为1ms,跨并发实例的拷贝开销会影响应用性能。使用引用传递方式传输对象可提升性能。 **示例:** @@ -108,7 +108,7 @@ export class Test { ## 跨并发实例传递带方法的class实例对象 -由于序列化传输实例对象时会丢失方法,因此在需要调用实例方法时,需使用引用传递方式。在数据处理过程中有需要解析的数据,可使用[ASON工具](ason-parsing-generation.md)解析。 +在序列化传输实例对象时,会丢失方法。因此,若需调用实例方法,应使用引用传递。处理数据时,若需解析数据,可使用[ASON工具](ason-parsing-generation.md)。 **示例:** diff --git a/zh-cn/application-dev/arkts-utils/sendablelrucache-recent-list.md b/zh-cn/application-dev/arkts-utils/sendablelrucache-recent-list.md index c1006dcde66305de77407f0c3640a7f4d767dd4c..4f462a6d5c4547f14cdca694a692ce78c9cbf5a4 100644 --- a/zh-cn/application-dev/arkts-utils/sendablelrucache-recent-list.md +++ b/zh-cn/application-dev/arkts-utils/sendablelrucache-recent-list.md @@ -5,10 +5,10 @@ > **说明:** > > 使用SendableLruCache实例对象时需加锁,避免多线程同时操作导致数据不一致。 -> 存放到SendableLruCache实例中的对象应为Sendable对象。 +> 存放到SendableLruCache实例中的对象必须是Sendable对象。 1. 创建SendableLruCache实例对象,并根据业务需求预设最大容量。
- 此例设置SendableLruCache实例的最大容量为4,用SendableClass类来管理,并导出SendableClass类实例对象。 + 此例设置SendableLruCache实例的最大容量为4,用SendableClass类管理,并导出SendableClass类实例对象。 ```ts // LruCache.ets diff --git a/zh-cn/application-dev/arkts-utils/sync-task-development.md b/zh-cn/application-dev/arkts-utils/sync-task-development.md index 1e547850e0c7cdfb282c91efee0959e302d25f05..44df47b2503afd09f11d01be91c4efdf241e1a94 100644 --- a/zh-cn/application-dev/arkts-utils/sync-task-development.md +++ b/zh-cn/application-dev/arkts-utils/sync-task-development.md @@ -1,12 +1,12 @@ # 同步任务开发指导 (TaskPool和Worker) -同步任务是指在多个线程之间协调执行的任务,其目的是确保多个任务按照一定的顺序和规则执行,例如使用锁来防止数据竞争。 +同步任务用于在多个线程间协调执行,确保任务按特定顺序和规则进行,如使用锁防止数据竞争。 -同步任务的实现需要考虑多个线程之间的协作和同步,以确保数据的正确性和程序的正确执行。 +同步任务的实现需要考虑多个线程之间的协作和同步。这确保了数据的正确性和程序的正确执行。 -由于TaskPool偏向于单个独立的任务,因此当各个同步任务之间相对独立时推荐使用TaskPool,例如一系列导入的静态方法,或者单例实现的方法。如果同步任务之间有关联性,则需要使用Worker。 +当同步任务之间相对独立时,推荐使用TaskPool,例如一系列导入的静态方法或单例实现的方法。如果同步任务之间有关联性,则需要使用Worker。 ## 使用TaskPool处理同步任务 @@ -83,7 +83,7 @@ struct Index { 当一系列同步任务需要使用同一个句柄调度,或者需要依赖某个类对象调度,且无法在不同任务池之间共享时,需要使用Worker。 -1. 在UI主线程中创建Worker对象,同时接收Worker线程发送回来的消息。DevEco Studio支持一键生成Worker,在对应的{moduleName}目录下任意位置,点击鼠标右键 > New > Worker,即可自动生成Worker的模板文件及配置信息。 +在UI主线程中创建Worker对象并接收Worker线程发送的消息。DevEco Studio支持一键生成Worker。在{moduleName}目录下任意位置,点击鼠标右键 > New > Worker,即可生成Worker的模板文件及配置信息。 ```ts // Index.ets diff --git a/zh-cn/application-dev/arkts-utils/taskpool-async-task-guide.md b/zh-cn/application-dev/arkts-utils/taskpool-async-task-guide.md index 25ac030dd00e27fe745366758f91c234d2617e4b..fb29797233e0e1a10d69993e640f1a43c85435b7 100644 --- a/zh-cn/application-dev/arkts-utils/taskpool-async-task-guide.md +++ b/zh-cn/application-dev/arkts-utils/taskpool-async-task-guide.md @@ -1,7 +1,7 @@ # TaskPool指定任务并发度场景 此处提供使用TaskPool创建[异步队列](../reference/apis-arkts/js-apis-taskpool.md#asyncrunner18)的开发指导,以相机预览流采集数据处理的功能为例。 -由于处理过程是个频繁耗时任务,如果相机采集过快,就丢弃之前的采集数据,缓存最新的一帧数据处理。 +由于处理过程是个频繁耗时任务,如果相机采集过快,就丢弃之前的采集数据,保留最新的一帧数据处理。 1. 导入需要用到的模块。 @@ -42,7 +42,7 @@ .fontSize(50) .fontWeight(FontWeight.Bold) .onClick(() => { - // 创建并发度为5的异步队列,等待队列个数为5。 + // 创建并发度为5的异步队列,等待队列个数为5 let asyncRunner:taskpool.AsyncRunner = new taskpool.AsyncRunner("async", 5, 5); // 每秒触发一次采集任务 setTimeout(() => { diff --git a/zh-cn/application-dev/arkts-utils/taskpool-communicates-with-mainthread.md b/zh-cn/application-dev/arkts-utils/taskpool-communicates-with-mainthread.md index 3caee31c8422d67117cb4a207c791162bdf34b97..ee6ba9fa209a1045f3f9c09c3b3cc29ee1198df4 100644 --- a/zh-cn/application-dev/arkts-utils/taskpool-communicates-with-mainthread.md +++ b/zh-cn/application-dev/arkts-utils/taskpool-communicates-with-mainthread.md @@ -1,10 +1,10 @@ # TaskPool任务与宿主线程通信 -如果一个Task不仅需要返回最终的执行结果,还需要定时通知宿主线程状态和数据的变化,或者需要分段返回大量数据(例如,从数据库中读取大量数据),可以通过以下方式实现。 +如果Task不仅需要返回最终执行结果,还需定时通知宿主线程状态和数据变化,或分段返回大量数据(如从数据库读取大量数据),可按以下方式实现。 下面以多个图片加载任务结果实时返回为例说明。 -1. 首先,实现一个方法,用来接收Task发送的消息。 +1. 实现接收Task消息的方法。 ```ts // TaskSendDataUsage.ets @@ -14,7 +14,7 @@ ``` -2. 然后,在需要执行的Task中,添加sendData()接口将消息发送给宿主线程。 +2. 在需要执行的Task中,添加sendData()接口将消息发送给宿主线程。 ```ts // IconItemSource.ets @@ -57,8 +57,8 @@ ``` -3. 最后,在宿主线程通过onReceiveData()接口接收消息。 - 这样宿主线程就可以通过notice()接口接收到Task发送的数据。 +3. 最后,在宿主线程通过 `onReceiveData()` 接口接收消息。 + 宿主线程可以通过`notice()`接口接收Task发送的数据。 ```ts // TaskSendDataUsage.ets diff --git a/zh-cn/application-dev/arkts-utils/taskpool-waterflow.md b/zh-cn/application-dev/arkts-utils/taskpool-waterflow.md index bc8b4a13b30d57c55f55495fc22c69cd57dc2e4f..74d77f1da40eecc1f90ff42e52d2d59e19a96db6 100644 --- a/zh-cn/application-dev/arkts-utils/taskpool-waterflow.md +++ b/zh-cn/application-dev/arkts-utils/taskpool-waterflow.md @@ -33,7 +33,7 @@ ``` -2. 封装一个瀑布流数据源,用于瀑布流组件加载数据。 +2. 封装一个瀑布流组件数据源,用于瀑布流组件加载数据。 ```ts // WaterFlowDataSource.ets diff --git a/zh-cn/application-dev/arkts-utils/time-consuming-task-overview.md b/zh-cn/application-dev/arkts-utils/time-consuming-task-overview.md index 82bd7f68208a12401cd5e842be34421bbbe737d9..df0101d50114dea8112912df885229cd2ffba3ea 100644 --- a/zh-cn/application-dev/arkts-utils/time-consuming-task-overview.md +++ b/zh-cn/application-dev/arkts-utils/time-consuming-task-overview.md @@ -9,9 +9,9 @@ | 常见业务场景 | 具体业务描述 | 是否为CPU密集型任务 | 是否为I/O密集型任务 | 是否为同步任务 | | -------- | -------- | -------- | -------- | -------- | -| 图片/视频编解码 | 将图片或视频进行编解码再展示。 | 是 | 是 | 否 | -| 压缩/解压缩 | 解压本地压缩包或压缩本地文件。 | 是 | 是 | 否 | -| JSON解析 | 序列化和反序列化JSON字符串。 | 是 | 否 | 否 | -| 模型运算 | 对数据进行模型运算分析等。 | 是 | 否 | 否 | -| 网络下载 | 密集网络请求下载资源、图片、文件等。 | 否 | 是 | 否 | -| 数据库操作 | 将聊天记录、页面布局信息、音乐列表信息等保存到数据库,或者应用二次启动时,读取数据库展示相关信息。 | 否 | 是 | 否 | +| 图片/视频编解码 | 将图像或视频进行编解码再展示。 | √ | √ | × | +| 压缩/解压缩 | 解压本地压缩包或压缩本地文件。 | √ | √ | × | +| JSON解析 | 序列化和反序列化JSON字符串。 | √ | × | × | +| 模型运算 | 对数据进行模型运算分析等。 | √ | × | × | +| 网络下载 | 密集网络请求下载资源、图片、文件等。 | × | √ | × | +| 数据库操作 | 将聊天记录、界面布局信息、音乐列表信息等保存到数据库,或者应用二次启动时,读取数据库展示相关信息。 | × | √ | × | diff --git a/zh-cn/application-dev/arkts-utils/worker-communicates-with-mainthread.md b/zh-cn/application-dev/arkts-utils/worker-communicates-with-mainthread.md index a189ad9dab4dc840c95edac8396eeb0c039df318..9adadc8a97d3d5ee79eb066265afb1fe18802940 100644 --- a/zh-cn/application-dev/arkts-utils/worker-communicates-with-mainthread.md +++ b/zh-cn/application-dev/arkts-utils/worker-communicates-with-mainthread.md @@ -1,7 +1,7 @@ # Worker和宿主线程的即时消息通信 -在ArkTS中,Worker相对于Taskpool存在一定的差异性,有数量限制但是可以长时间存在。一个[Worker](worker-introduction.md)中可能会执行多个不同的任务,每个任务的执行时长或返回结果可能都不同,宿主线程需要根据情况调用Worker中的不同方法,Worker则需要及时地将结果返回给宿主线程。 +在ArkTS中,Worker相对于Task Pool存在一定的差异性,有数量限制但是可以长时间存在。一个[Worker](worker-introduction.md)中可能会执行多个不同的任务,每个任务的执行时长或返回结果可能都不同,宿主线程需要根据情况调用Worker中的不同方法,Worker则需要及时地将结果返回给宿主线程。 下面以Worker响应"hello world"请求为例说明。 @@ -23,7 +23,7 @@ ``` -2. 这里的宿主线程是UI主线程,在宿主线程中创建Worker对象,当点击Button时调用postMessage方法向Worker线程发送消息,通过Worker的onmessage方法接收Worker线程返回的数据。 +2. 这里的主线程是UI主线程,在主线程中创建Worker对象,当点击Button时调用postMessage方法向Worker线程发送消息,通过Worker的onmessage方法接收Worker线程返回的数据。 ```ts // Index.ets diff --git a/zh-cn/application-dev/arkts-utils/worker-invoke-mainthread-interface.md b/zh-cn/application-dev/arkts-utils/worker-invoke-mainthread-interface.md index 29b50d44fb5fd168235239c1ac3b71d8141f4d1c..df94efc3d9c0822540a3a22445e4c23af3349749 100644 --- a/zh-cn/application-dev/arkts-utils/worker-invoke-mainthread-interface.md +++ b/zh-cn/application-dev/arkts-utils/worker-invoke-mainthread-interface.md @@ -2,7 +2,7 @@ 如果一个接口已在宿主线程中实现,Worker可以通过以下方式调用该接口。 -以下示例展示了Worker如何同步调用宿主线程的接口。 +以下示例展示了Worker同步调用宿主线程接口的方法。 1. 首先,在宿主线程实现需要调用的接口,并创建Worker对象,在Worker对象上注册需要调用的对象。 diff --git a/zh-cn/application-dev/arkts-utils/worker-postMessage-sendable.md b/zh-cn/application-dev/arkts-utils/worker-postMessage-sendable.md index 217d262e52729c3140f4ddbcf8ec7ec4984c8b43..82ec056a0299c1190bc5f261cb71871a58721a62 100644 --- a/zh-cn/application-dev/arkts-utils/worker-postMessage-sendable.md +++ b/zh-cn/application-dev/arkts-utils/worker-postMessage-sendable.md @@ -1,10 +1,10 @@ # 多级Worker间高性能消息通信 -多级[Worker](worker-introduction.md)(即通过父Worker创建子Worker的机制形成层级线程关系)间通信是一种常见的需求,由于Worker线程生命周期由用户自行管理,因此需要注意多级Worker生命周期的正确管理,建议开发者确保销毁父Worker前先销毁所有子Worker。 +多级[Worker](worker-introduction.md)(即通过父Worker创建子Worker的机制形成层级线程关系)间通信是一种常见的需求,由于Worker线程生命周期由用户自行管理,因此需要注意多级Worker生命周期的正确管理,建议开发者确保关闭父Worker前先关闭所有子Worker。 -本文介绍如何在多级Worker间实现高性能消息通信,高性能消息通信的关键在于[Sendable对象](arkts-sendable.md),结合Worker的[postMessageWithSharedSendable接口](../reference/apis-arkts/js-apis-worker.md#postmessagewithsharedsendable12),可以实现线程间高性能的对象传递。以数据克隆场景为例,假设有三个Worker,一个父Worker和两个子Worker,父Worker负责创建子Worker,并向子Worker发送数据克隆任务,子Worker负责接收任务并执行数据克隆操作,完成后将克隆结果返回给父Worker。 +本文介绍如何在多级Worker间实现高性能消息通信。高性能消息通信的关键在于[Sendable对象](arkts-sendable.md),结合[postMessageWithSharedSendable接口](../reference/apis-arkts/js-apis-worker.md#postmessagewithsharedsendable12),可以实现线程间高性能的对象传递。例如,在数据克隆场景中,假设有一个父Worker和两个子Worker。父Worker负责创建子Worker,并向子Worker发送数据克隆任务。子Worker接收任务并执行数据克隆操作,完成后将克隆结果返回给父Worker。 -1. 准备一个Sendable类CopyEntry,用于封装克隆任务数据。 +1. 准备一个Sendable类CopyEntry,封装克隆任务数据。 ```ts // CopyEntry.ets diff --git a/zh-cn/application-dev/reference/apis-avcodec-kit/_a_v_source.md b/zh-cn/application-dev/reference/apis-avcodec-kit/_a_v_source.md deleted file mode 100644 index 4fcc3a80ae9b284f8431daeaa7fa6a996a9708f8..0000000000000000000000000000000000000000 --- a/zh-cn/application-dev/reference/apis-avcodec-kit/_a_v_source.md +++ /dev/null @@ -1,313 +0,0 @@ -# AVSource - - -## 概述 - -AVSource模块提供用于构造媒体资源对象功能的函数。 - -**系统能力:** SystemCapability.Multimedia.Media.Spliter - -**相关示例:** [AVCodec](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Media/AVCodec) - -**起始版本:** 10 - - -## 汇总 - - -### 文件 - -| 名称 | 描述 | -| -------- | -------- | -| [native_avsource.h](native__avsource_8h.md) | 声明用于音视频媒体数据解析的接口。 | - - -### 类型定义 - -| 名称 | 描述 | -| -------- | -------- | -| typedef struct [OH_AVSource](#oh_avsource) [OH_AVSource](#oh_avsource) | 为媒体资源接口定义native层对象。 | - - -### 函数 - -| 名称 | 描述 | -| -------- | -------- | -| [OH_AVSource](#oh_avsource) \* [OH_AVSource_CreateWithDataSource](#oh_avsource_createwithdatasource) ([OH_AVDataSource](_o_h___a_v_data_source.md) \*dataSource) | 为用户自定义数据源的资源对象创建OH_AVSource实例,可以通过调用OH_AVSource_Destroy接口释放实例。 | -| [OH_AVSource](#oh_avsource) \* [OH_AVSource_CreateWithDataSourceExt](#oh_avsource_createwithdatasourceext) ([OH_AVDataSourceExt](_o_h___a_v_data_source_ext.md) \*dataSource, void *userData) | 为用户自定义数据源的资源对象创建OH_AVSource实例,可以通过调用OH_AVSource_Destroy接口释放实例。回调支持通过userData传递用户自定义数据。 | -| [OH_AVSource](#oh_avsource) \* [OH_AVSource_CreateWithURI](#oh_avsource_createwithuri) (char \*uri) | 为统一资源标识符对应的资源对象创建OH_AVSource实例。 | -| [OH_AVSource](#oh_avsource) \* [OH_AVSource_CreateWithFD](#oh_avsource_createwithfd) (int32_t fd, int64_t offset, int64_t size) | 为文件描述符对应的资源对象创建OH_AVSource实例。 | -| [OH_AVErrCode](_core.md#oh_averrcode) [OH_AVSource_Destroy](#oh_avsource_destroy) ([OH_AVSource](#oh_avsource) \*source) | 销毁OH_AVSource实例并清理内部资源。 | -| [OH_AVFormat](_core.md#oh_avformat) \* [OH_AVSource_GetSourceFormat](#oh_avsource_getsourceformat) ([OH_AVSource](#oh_avsource) \*source) | 获取媒体资源文件的基础信息。 | -| [OH_AVFormat](_core.md#oh_avformat) \* [OH_AVSource_GetTrackFormat](#oh_avsource_gettrackformat) ([OH_AVSource](#oh_avsource) \*source, uint32_t trackIndex) | 获取轨道的基础信息。 | -| [OH_AVFormat](_core.md#oh_avformat) \* [OH_AVSource_GetCustomMetadataFormat](#oh_avsource_getcustommetadataformat) ([OH_AVSource](#oh_avsource) \*source) | 获取自定义元数据的基础信息。 | - - -## 类型定义说明 - - -### OH_AVSource - -``` -typedef struct OH_AVSource OH_AVSource -``` -**描述** -为媒体资源接口定义native层对象。 - -**起始版本:** 10 - - -## 函数说明 - - -### OH_AVSource_CreateWithDataSource() - -``` -OH_AVSource* OH_AVSource_CreateWithDataSource (OH_AVDataSource * dataSource) -``` -**描述** -为用户自定义数据源的资源对象创建OH_AVSource实例,可以通过调用OH_AVSource_Destroy接口释放实例。 - -**系统能力:** SystemCapability.Multimedia.Media.Spliter - -**起始版本:** 12 - -**参数:** - -| 名称 | 描述 | -| -------- | -------- | -| dataSource | 用户自定义数据源。 | - -**返回:** - -如果执行成功,则返回一个指向OH_AVSource实例的指针,否则返回NULL。 - -可能的故障原因: -1. dataSource为nullptr; -2. dataSource->size == 0; -3. 设置数据源失败; -4. 内存不足; -5. 解码器引擎为nullptr; -6. dataSource->readAt == nullptr。 - - -### OH_AVSource_CreateWithDataSourceExt() - -``` -OH_AVSource *OH_AVSource_CreateWithDataSourceExt(OH_AVDataSourceExt *dataSource, void *userData) -``` -**描述** -为用户自定义数据源的资源对象创建OH_AVSource实例,可以通过调用OH_AVSource_Destroy接口释放实例。回调支持通过userData传递用户自定义数据。 - -**系统能力:** SystemCapability.Multimedia.Media.Spliter - -**起始版本:** 20 - -**参数:** - -| 名称 | 描述 | -| -------- | -------- | -| dataSource | 指向数据源结构体的指针,该结构体可用于获取输入数据。 | -| userData | 指向用户自定义数据的指针。 | - -**返回:** - -如果执行成功,则返回一个指向OH_AVSource实例的指针,否则返回NULL。 - -可能的故障原因: -1. dataSource为nullptr。 -2. dataSource->size == 0。 -3. 设置数据源失败。 -4. 内存不足。 -5. 解码器引擎为nullptr。 -6. dataSource->readAt == nullptr。 - - -### OH_AVSource_CreateWithFD() - -``` -OH_AVSource* OH_AVSource_CreateWithFD (int32_t fd, int64_t offset, int64_t size) -``` -**描述** -为文件描述符对应的资源对象创建OH_AVSource实例。可以通过调用OH_AVSource_Destroy接口释放实例。 - -该接口如果传入offset不为文件起始位置,或size不为文件大小时,可能会因数据获取不完整导致 OH_AVSource创建失败、后续解封装失败等未定义错误。 - -**系统能力:** SystemCapability.Multimedia.Media.Spliter - -**起始版本:** 10 - -**参数:** - -| 名称 | 描述 | -| -------- | -------- | -| fd | 数据资源的文件描述符。 | -| offset | 开始读取数据的位置。 | -| size | 文件的字节数大小。 | - -**返回:** - -执行成功返回一个指向OH_AVSource实例的指针,否则返回NULL。 - -可能的故障原因: - -1. fd无效; -2. 传入offset不是文件起始位置; -3. size错误; -4. 资源无效; -5. 文件格式不支持。 - - -### OH_AVSource_CreateWithURI() - -``` -OH_AVSource* OH_AVSource_CreateWithURI (char *uri) -``` -**描述** -为统一资源标识符对应的资源对象创建OH_AVSource实例,可以通过调用OH_AVSource_Destroy接口释放实例。 - -**系统能力:** SystemCapability.Multimedia.Media.Spliter - -**起始版本:** 10 - -**参数:** - -| 名称 | 描述 | -| -------- | -------- | -| uri | 远程媒体资源的统一资源标识符。 | - -**返回:** - -执行成功返回一个指向OH_AVSource实例的指针,否则返回NULL。 - -可能的故障原因: - -1. 网络异常; -2. 资源无效; -3. 文件格式不支持。 - - -### OH_AVSource_Destroy() - -``` -OH_AVErrCode OH_AVSource_Destroy (OH_AVSource *source) -``` -**描述** -销毁OH_AVSource实例并清理内部资源。同一实例只能被销毁一次。销毁的实例在被重新创建之前不能再被使用。建议实例销毁成功后将指针置为NULL。 - -**系统能力:** SystemCapability.Multimedia.Media.Spliter - -**起始版本:** 10 - -**参数:** - -| 名称 | 描述 | -| -------- | -------- | -| source | 指向OH_AVSource实例的指针。 | - -**返回:** - -返回函数结果: - -AV_ERR_OK:操作成功。 - -AV_ERR_INVALID_VAL: - - 1. source指针无效; - 2. 空指针或非OH_AVSource实例。 - - -### OH_AVSource_GetCustomMetadataFormat() - -``` -OH_AVFormat *OH_AVSource_GetCustomMetadataFormat(OH_AVSource *source) -``` - -**描述** - -获取自定义元数据的基础信息。 - -需要注意的是,指向的OH_AVFormat实例在生命周期结束时需开发者通过调用接口[OH_AVFormat_Destroy](_core.md#oh_avformat_destroy)释放。 - -**系统能力:** SystemCapability.Multimedia.Media.Spliter - -**起始版本:** 18 - -**参数:** - -| 名称 | 描述 | -| -------- | -------- | -| source | 指向OH_AVSource实例的指针。 | - -**返回:** - -执行成功返回元数据的基础信息,否则返回NULL。 - -可能的故障原因: - -1. source指针无效; -2. 空指针或非OH_AVSource实例; -3. source没有初始化。 - - -### OH_AVSource_GetSourceFormat() - -``` -OH_AVFormat* OH_AVSource_GetSourceFormat (OH_AVSource *source) -``` -**描述** -获取媒体资源文件的基础信息。 - -需要注意的是,指向的OH_AVFormat实例在生命周期结束时需开发者通过调用接口[OH_AVFormat_Destroy](_core.md#oh_avformat_destroy)释放。 - -**系统能力:** SystemCapability.Multimedia.Media.Spliter - -**起始版本:** 10 - -**参数:** - -| 名称 | 描述 | -| -------- | -------- | -| source | 指向OH_AVSource实例的指针。 | - -**返回:** - -执行成功返回文件的基础信息,否则返回NULL。 - -可能的故障原因: - -1. source指针无效; -2. 空指针或非OH_AVSource实例; -3. source没有初始化。 - - -### OH_AVSource_GetTrackFormat() - -``` -OH_AVFormat* OH_AVSource_GetTrackFormat (OH_AVSource *source, uint32_t trackIndex) -``` -**描述** -获取轨道的基础信息。 - -需要注意的是,指向的OH_AVFormat实例在生命周期结束时需开发者通过调用接口[OH_AVFormat_Destroy](_core.md#oh_avformat_destroy)释放。 - -**系统能力:** SystemCapability.Multimedia.Media.Spliter - -**起始版本:** 10 - -**参数:** - -| 名称 | 描述 | -| -------- | -------- | -| source | 指向OH_AVSource实例的指针。 | -| trackIndex | 需要获取信息的轨道的索引。 | - -**返回:** - -执行成功返回轨道的基础信息,否则返回NULL。 - -可能的故障原因: - -1. source指针无效,空指针或非OH_AVSource实例; -2. 轨道的索引超出范围; -3. source没有初始化。