2

我有一大段代码(用 Emscripten 编译)在网络工作者中运行。该页面使用一个 postMessage 在 worker 中启动一项任务,当 worker 完成时,它会发送另一个 postMessage。伟大的。但是,我想添加一个新功能,该功能需要我在执行过程中暂停工作人员,通过 postMessage 将消息踢回浏览器,等待用户通过 postMessage 提交有效响应,然后完成执行. 但是,我想不出任何有效的方法。我试图让工作人员在无限循环中等待,直到在消息到达时设置控制变量失败,因为无限循环阻止了工作人员的消息处理程序的执行。我可以通过抛出异常来打破工作者执行,但是我不知道如何恢复执行。

有没有人有任何想法?

4

2 回答 2

1

在 JS 中,创建类中断机制的一种方法是使用 setTimeout(some_function,1)。这样,代码 some_function 执行完成,如果其他事件处理程序在队列中,则可以处理它们。

这种模式将取决于您提到的“大量代码”是否可以拆分为顺序步骤(或方法)。说,如果它是这样的:

step1();
step2();
step3();

所以,比如说在“step1”方法的执行过程中,如果你得到一个“中断”或者换句话说发生了一个“消息”事件,它可以在 step 完成执行之后但在 step2 开始之前处理。

这一切都取决于您的代码正在解决的问题的本质是什么。更多的上下文会很方便。

于 2012-09-27T23:12:51.370 回答
1

我要解决这个问题的方法是让一个主要的“控制器”工作人员作为共享 Web 工作人员运行。然后,我会让该控制器在必要时分拆其他工人,通过postMessage.

这样一来,您的共享工作者就像您的主循环一样,可以让事情顺利进行。我会避免在那个主循环中做任何类型的非异步工作。

于 2012-06-15T15:19:10.280 回答