Вызов функции Lua из другого потока - PullRequest
0 голосов
/ 15 декабря 2009

В моем примере приложения у меня в основном два потока.

Основной поток содержит движок Lua (который не является потокобезопасным) и регистрирует некоторые функции C ++ в этом движке. Однако выполнение одной из этих функций занимает слишком много времени (поскольку оно загружает некоторые файлы через Интернет), и я хочу, чтобы движок Lua продолжал выполнять другие действия без блокировки в процессе загрузки.

Поэтому я хочу сделать это асинхронным: когда из Lua вызывается функция downloadFile(), я создаю новый поток, который выполняет загрузку. Затем функция возвращается, и движок Lua может обрабатывать другую работу. Когда загрузка закончится, второй поток каким-то образом должен сообщить основному потоку, что он должен каким-то образом вызвать дополнительную функцию processFile(), чтобы завершить ее.

Вот где я сейчас борюсь: какое самое простое / чистое решение для достижения этой цели?

Ответы [ 4 ]

3 голосов
/ 15 декабря 2009

Попробуйте LuaLanes , например. Также здесь .

2 голосов
/ 17 декабря 2009

Новый объект пользовательских данных может быть возвращен вашей downloadFile() или функцией с аналогичным именем для запуска потока. Этот новый объект пользовательских данных будет содержать дескриптор потока и иметь связанную мета-таблицу с записью __index, которая будет иметь функцию проверки состояния завершения загрузки и содержать другие функции синхронизации.

Возможно, выглядит так:

local a = downloadFile("foo")

-- do other things

a:join() -- now let the download finish

processFile()

или это:

local a = downloadFile("foo")

local busywork = coroutine.create(doOtherStuff)

while(not a:finished()) do
  coroutine.resume(busywork)
end

processFile()
1 голос
/ 15 декабря 2009

Без интеграции многопоточности в lua (что не так сложно, Lua уже готов к этому), ваше единственное решение - обрабатывать сигнализацию в c ++.

Из того, что вы сказали, нет никакого взаимодействия с Lua в потоке, который создает downloadFile (), должен ли Lua вызывать processFile ()? Если нет, что мешает вам справиться со всем этим в c ++? Если вам нужно уведомить Lua, вы всегда можете использовать функцию обратного вызова (сохранить ее в реестре), обработать сигнал в c ++ и запустить обратный вызов.

Поскольку ваш движок не является поточно-ориентированным, я не думаю, что в Lua есть способ справиться с ним.

0 голосов
/ 20 декабря 2009

Возвращает «будущий» объект из функции downloadFile. Это можно использовать для проверки результата длительной асинхронной операции. См. java.util.concurrent.Future или QFuture для примеров реализаций. Кроме того, проверьте эту ветку списка рассылки для обсуждения реализации фьючерсов / обещаний в Lua с использованием coroutines .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...