PNaCl:在“HandleMessage”功能中处理另一条消息?

时间:2014-05-29 15:40:15

标签: google-nativeclient

我正在使用PNaCl,我首先收到的消息是在'HandleMessage'函数中以正常方式处理的,但是在当前的HandleMessage执行中,我需要等待用户输入来自其他消息以完成执行。

我想知道是否可以这样做(在'HandleMessage'函数中等待时处理消息)?如果是这样,有人可以给我一个技巧吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

HandleMessage当前在一个线程(主线程)上调用。因此,在处理其他消息时,您无法收到消息。

我们通常建议您生成一个新线程来完成您的工作,并让主线程处理消息,并将它们排队以便处理新线程。请查看SDK中的nacl_io_demo示例,了解此技术的示例(位于examples/demo/nacl_io中)。

另一种解决方案是使用状态机;即在变量而不是堆栈中跟踪当前状态。

例如:

enum State {
  STATE_INIT,
  STATE_WAITING_FOR_INPUT,
  STATE_DO_OTHER_STUFF,
};

State state_;

virtual void HandleMessage(const pp::Var& var_message) {
  switch (state_) {
    case STATE_INIT:
      if (var_message.AsString() == "first_message") {
        state_ = STATE_WAITING_FOR_INPUT;
        // Do some work before you need the user input ...
      }
      break;

    case STATE_WAITING_FOR_INPUT:
      if (var_message.AsString() == "user_input") {
        // Do more work, now that we've received input from the user...
        state_ = STATE_DO_OTHER_STUFF;
      }
      break;
  }
}