如何在GJS中模拟并发?

问题描述 投票:0回答:1

我正在尝试使用

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

非常感谢

gnome gnome-shell-extensions gjs
1个回答
0
投票

当您致电

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);
    }
  });
}

另请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.