Ожидание асинхронного события в Lua - PullRequest
0 голосов
/ 13 июля 2011

У меня есть библиотека в Lua, которая создает и анализирует пакеты данных для протокола.Когда я отправляю пакет, я ожидаю ответ от получателя, который затем анализируется в таблице.Я пытаюсь написать обертку вокруг этой библиотеки, чтобы я мог выполнить вызов функции, подобный следующему: result = SendUnicast(dest,packetData) и получить проанализированную таблицу ответов, возвращаемую в результат.

Моя проблема двоякая: 1) входящее сообщение поступает асинхронно и в другом потоке, чем исполняемый скрипт, и 2) следующий полученный мной пакет не обязательно является ответом на мой запрос, я долженанализируем входящий пакет и сопоставляем идентификатор последовательности.

Поток программы в настоящее время выглядит примерно так:

[Поток пользовательского интерфейса C #]

  • Нажатие кнопки
  • Запуск сценария Lua
    • Вызов SendUnicast
    • Ожидание ответа

[Поток данных C #]

  • Входящее сообщение
    • Передать сообщение функции парсера Lua
    • , если последовательность соответствует команде ожидания, сохранить проанализированную таблицу, возобновить блокировку

[C #Поток пользовательского интерфейса]

  • Lua scipt возвращает проанализированную таблицу

Я не могу найти хороший метод для блокировки выполняемого в данный момент сценария (в UIThread).Создание сопрограммы для вызова, когда сообщение анализируется, а затем while coroutine.status(co) ~= "dead", кажется, убивает мой интерпретатор lua.

EDIT

Я отмечаю ответ BMitch как принятыйпотому что это правильный способ справиться с этой проблемой.Однако я предупрежу вас, что LuaInterface не поддерживает сопрограммы, и мне пришлось добавить их поддержку в код C #.

1 Ответ

1 голос
/ 13 июля 2011

В потоке пользовательского интерфейса выполните:

while ((status=lua_resume(L_coroutine, 0)) == LUA_YIELD) {
  semaphore_wait(); /* whatever the appropriate C# call is */
}

«Ожидание ответа» должно выглядеть примерно так:

while not results[my_result] do
  coroutine.yield()
end

Функция «входящее сообщение» должна выглядеть следующим образом:Lua:

results[cur_result]=parsed_message

И, наконец, вернувшись в C# для "входящего сообщения", вызовите соответствующую функцию semaphore_post().

Извините, если мой C# выглядит ужасно, я 'Я C программист в Linux, поэтому я постарался сделать эту сторону общей.

...