我正在尝试使用
aosd_cat
来直观地标记 Linux 桌面上的每个辅助功能元素。我可以同步生成此命令,没有问题,但无法找到一种方法多次并行生成此命令以一次可视化每个元素(即,在上一个可视化完成之前不会阻塞)
我还想保留每个cancelHandle的列表,这样当GUI更新时我可以立即取消它们。
// condensed example with just relevant code
function paintScreen() {
try {
const cancelHandle = Gio.Cancellable.new();
const proc = Gio.Subprocess.new(["aosd_cat"], Gio.SubprocessFlags.STDIN_PIPE);
proc.communicate_utf8("LABEL_NAME", cancelHandle);
} catch (e) {
logError(e);
}
}
我尝试过使用
.communicate_async()
或 .wait_async()
但似乎都不起作用,并且即使我等待它也不会生成命令。
在 Python 中,我会使用 threadpoolexecutor 或类似的东西,但这显然不是这里的选择。
我不知道如何解决这个问题。我还想要一个继续让我将 stdin 传递给
aosd_cat
命令的解决方案。您可以假设我的所有其他代码都工作正常。
如果重要的话,我正在使用 ts-for-gir 从 TS 编译为 GJS
非常感谢
当您致电
Gio.Subprocess.new()
时,该过程开始。如果没有看到你尝试过的内容,很难说,但你可能已经尝试过这个:
await proc.communicate_utf8_async("LABEL_NAME", cancellable, callback);
除非函数已被promisified,否则不会返回 Promise 或等待结果。您可以尝试一下,注意省略了“callback”参数:
Gio._promisify(Gio.Subprocess.prototype, 'communicate_utf8_async',
'communicate_utf8_finish');
async function paintScreen() {
try {
const cancelHandle = Gio.Cancellable.new();
const proc = Gio.Subprocess.new(["aosd_cat"], Gio.SubprocessFlags.STDIN_PIPE);
await proc.communicate_utf8_async("LABEL_NAME", cancelHandle);
} catch (e) {
console.error(e);
}
}
否则你需要使用回调(可以手动包装在 Promise 中):
function paintScreen() {
const cancelHandle = Gio.Cancellable.new();
const proc = Gio.Subprocess.new(["aosd_cat"], Gio.SubprocessFlags.STDIN_PIPE);
proc.communicate_utf8_async("LABEL_NAME", cancelHandle, (_sourceObject, result) => {
try {
const [, _stdout, _stderr] = proc.communicate_utf8_finish(result);
} catch (e) {
console.error(e);
}
});
}
另请参阅: