DLL и Lua

Страницы: 1
RSS
DLL и Lua, Ошибка
 
Добрый день, не знаю как отладить ошибку при работе DLL. При вызове функции  Lua_pcal, компилятор выдаёт следующие:

Скрытый текст

Dll (на с++)
Скрытый текст
Lua
Скрытый текст

Ошибка возникает в случайный момент, может вообще не появится.
 
Цитата
SnamI написал:
std::thread thr(test, L); //Запускает выполнение функции в отдельном потоке
Так делать нельзя. Вы в потоке используете стек, который может использовать квик/ваш скрипт.
создайте новый луа_стейт под этот поток. запомните куданить в регистр например функцию message. ну и работайте с этим стейтом из потока своего. все будет работать.
 
Цитата
Антон (band) написал:
Цитата
SnamI написал:
std::thread thr(test, L); //Запускает выполнение функции в отдельном потоке
Так делать нельзя. Вы в потоке используете стек, который может использовать квик/ваш скрипт.
создайте новый луа_стейт под этот поток. запомните куданить в регистр например функцию message. ну и работайте с этим стейтом из потока своего. все будет работать.
А как новый луа стек будет взаимодействовать со скриптом? Изначально я отталкивался от СFunction , получается скрипт должен быть сообщать луа стек.

Пробовал загружать скрипт, но безрезультатно.
Скрытый текст
 
Хотя, вроде, разобрался.
Скрытый текст


Получается любой луа стек, приходящий от скрипта, может использоваться Квиком?
 
SnamI, в своем потоке лучше не делать lua_newthread
Код
static void test(lua_State *L)
{        
    using namespace std::chrono_literals;
    for (size_t i = 0; i < 5000; i++)
    {
        lua_getglobal(L, "message");
        lua_pushstring(L, "test");
        lua_pcall(L, 1, 0, 0);
        std::this_thread::sleep_for(1ms);
    }
}

static int forLua_StartProgramm(lua_State *L)
{
    lua_State *tL = lua_newthread(L);
    std::thread thr(test, tL);
    thr.detach();
    return 0;
}
есть основной поток квика. есть поток скрипта(функция main). если создать свой поток и начать писать в стек с которым идет паралельная работа (в этих 2х потоках) без синхронизации пойдет одновременная запись. стек будет битый и это приводит к таким ошибкам.
 
забыл, lua_newthread на стек добавит поток. запоминаем в регистр чтобы ГЦ не потер его(заодним со стека уберем, ни к чему он там). luaL_ref(L, LUA_REGISTRYINDEX);
Страницы: 1
Читают тему
Наверх