---
description: 进程模块 - 进程休眠与触发
---

# Sleep & Trigger

由于 Screeps 本身是一个资源、建筑、等级等都动态变化的游戏 🎮，所以其实是有必要支持进程的休眠💤与触发✋。

这就比较类似于操作系统里面，驱动程序的触发✋与休眠💤。只有当相关硬件对于操作系统来说可访问时，才会有相关驱动程序启动来操作该硬件。

而为了支持进程的休眠💤与触发✋，首先，我们需要添加特殊的休眠返回值。即，在进程返回休眠之后，加入休眠队列，只有在触发时唤醒。

而对于进程的触发，则需要增加触发条件。触发条件本身需要增加监视功能。此外，需要对进程有所标识。

一种选择是在进程休眠的同时，返回一定的触发条件。但是有一些进程初始时即是休眠状态，而且休眠后的触发条件可能很复杂，这种返回休眠与相应的触发条件本身比较耦合。所以我倾向于采用另一种方法，即休眠与触发条件**分开**。

而至于进程的标识，考虑到进程有描述，则就可以用进程的描述来标识。但是，考虑到一个模块可能会拆分成几个进程，而这几个进程可能同时休眠或触发，所以可能需要对进程增加一个额外的可选标识，即模块名。

但是，对于模块名的设计，是比较难以处理当其中一个进程想要休眠时，其他的进程是否需要休眠。因此，进程的标识仍然是采用描述。但是，描述又无法保证唯一，仍然会出现类似采用模块名的问题，所以最好还是采用进程 Id。

{% hint style="info" %}
**注意**：休眠**只能进程自己请求休眠**，因为进程与进程之间可以通过信号量控制关系。同样的道理，触发也只能通过进程模块内部提供的触发器触发。
{% endhint %}

{% hint style="danger" %}
**注意**：进程休眠时, 也应当释放所有的资源。
{% endhint %}

### 🏹 触发器设计

对于触发器，我们其实可以设计的比较灵活。对标数电里面的触发器，我们可以有 **满足特定条件触发**， **某条件变化到另一个条件触发**， 以及在我们的场景中，**特定函数返回特定值后触发**。

所以，我们可以期望写出这样的代码：

```typescript
// 之前返回假，变化为真时触发
A.proc.trigger('watch', () => ..., [ 唤醒进程 Id ])

// 在特定函数执行后, 执行
// 一般必须为 prototype 上的函数
A.proc.trigger('after', Creep.prototype.claimController, (returnValue, target) => ...)
```
