Anton написал: Окончательно установил, что lua_error из 8.5 генерирует лонгджамп вместо эксепшена. Вот это работает (отлавливает ошибку)
Код
static int qmain(lua_State * s)
{
lua_longjmp jbuf;
jbuf.status = 0 ;
jbuf.previous = s - > errorJmp;
s - > errorJmp = & jbuf;
if (setjmp(jbuf.b) = = 0 )
{
luaL_error(s, "err" );
}
s - > errorJmp = jbuf.previous;
return 0 ;
}
Это залет, товарищи.
Добрый день,
Действительно, lua53.dll собрана с отличной от lua5.1.dll конфигурацией. Мы исправим конфигурацию в ближайшем обновлении ПО.
Пользователь
Сообщений: Регистрация: 30.01.2015
22.04.2020 06:32:37
Цитата
Sergey Gorokhov написал: В Lua машине 5.3.5 нет такой функции как lua_call (). Есть её аналог lua_callk.Используйте ее.Либо добавьте в свой код что то вроде этого:#define lua_call(L,n,r) lua_callk(L, (n), ®, 0, NULL)
Именно так и сделано в штатном файле lua.h из Lua 5.3.5 - lua_call является вызовом lua_callk Вот пример для воспроизведения:
quio, проблема изучается. Постараемся в ближайшее время дать ответ.
Пользователь
Сообщений: Регистрация: 23.01.2015
22.04.2020 10:30:16
Цитата
Latrop написал: Примитивная dll в OnAllTrade просто дергать напр getInfoParam("VERSION") и больше вообще ничего, никаких эксепшенов, но после коннекта и получения прим 50-100 тыс тиков валится:
Critical error ACCESS_VIOLATION in script...
Что это за беда такая может быть?...
Если в OnAllTrade вообще ничего не делать, пустышка, то не падает. Но такой способ обхода проблемы не очень подходит :)
Добрый день,
К сожалению, нам не удалось по присланным данным воспроизвести ошибку. Если это возможно, пришлите пример кода, работа с которым приводит к сбою.
подскажите, а для чего вообще вы хотите запускать корутины как треды в lua? это небезопасно и неуправляемо. не лучше ли использовать для этого разные скрипты?
Пользователь
Сообщений: Регистрация: 30.01.2015
22.04.2020 16:19:07
Цитата
rst9 написал: для чего вообще вы хотите запускать корутины как треды в lua?
Для выполнения работы, требующей блокировки нативного потока.
ну, в том, что если квик завершит работу вашего скрипта, то про ваши потоки он ничего не знает, и если они не успели остановиться - то все, привет. можно ухищряться, я делал через и отладку, и через сборщик мусора, но все равно, это невозможно сделать нормально. а, кроме того, это работает только для квика, а не вообще в lua. им нужно было питон встраивать, а не lua, не было бы проблем.
Цитата
quio написал: А если этим потокам нужно взаимодействовать?
например, так: между квиками она тоже умеет.
Пользователь
Сообщений: Регистрация: 30.01.2015
22.04.2020 21:20:24
Цитата
rst9 написал: в том, что если квик завершит работу вашего скрипта, то про ваши потоки он ничего не знает, и если они не успели остановиться - то все, привет
Конечно, не знает. Скрипт сам долежен корректно завершать свои потоки, что он у меня успешно и делает. Выбор Lua в качестве интерпретатора скриптов, на мой взгляд, было отличным решением разработчиков. Этот язык прекрасно подходит для задач, для которых он там используется. Раньше немного расстраивало, что версия языка использована устаревшая. Главное, что бы он работал без глюков. Ну и хотелось бы более глубокой интеграции.
В частности до сих пор (8.4) часто бывает невозможно заказать обезличенные сделки, если не открыта таблица обезличенных сделок. Почему-то этот косяк все никак не устранят.
Пользователь
Сообщений: Регистрация: 27.08.2018
22.04.2020 21:27:29
Цитата
rst9 написал: им нужно было питон встраивать, а не lua, не было бы проблем.
проблем было бы больше в разы lua идеален для встраивания. это точно грамотный выбор и не только в АРКА.
вот если бы еще давали своих клиентов к их серверам коннектить за маленькие пятачки было бы вапще шоколадно но это фантастика , тк нифига не омерика :)
Пользователь
Сообщений: Регистрация: 19.04.2020
22.04.2020 23:18:56
lua машина - принципиально однопоточная, за счет этого она такая быстрая и легкая. то, что ее для квика перелопатили так, чтобы она не валилась при вызове из разных потоков - решение спорное, качество этих доработок неизвестно (ну, точнее, известно, и оно так себе). питон точно такой же расширяемый язык и он от рождения нормально переваривает треды. да, там есть gil, но чтобы lua стала многопоточной, в нее добавили такой же gil, только хуже и сделанный на коленке.
Пользователь
Сообщений: Регистрация: 19.04.2020
22.04.2020 23:21:25
Цитата
quio написал: Скрипт сам долежен корректно завершать свои потоки, что он у меня успешно и делает.
это вы так думаете. тормозните тред, чтобы он не успел завершиться до истечения паузы на завершение скрипта, и посмотрите, что будет.
Пользователь
Сообщений: Регистрация: 21.08.2015
23.04.2020 01:18:12
Цитата
rst9 написал: это вы так думаете. тормозните тред, чтобы он не успел завершиться до истечения паузы на завершение скрипта, и посмотрите, что будет.
Зачем вот людей запугивать ) Верните из OnStop 72 часа и завершайтесь сколько влезет.
Пользователь
Сообщений: Регистрация: 27.08.2018
23.04.2020 09:12:58
Цитата
rst9 написал: питон точно такой же расширяемый язык и он от рождения нормально переваривает треды.
это холивар уровня: что лучше - шарп или кресты.
про реализацию qlua vm всё может быть и так, но тут есть куда рости и есть контроль lua это про стандарты, оптимальность и контроль
многочисленные примеры - и питон один из них - показывают, что безудержное развивание в интересах средних прогеров или вообще непрогеров приводит к потере всего, что нужно ценить и беречь: стандарты, оптимальность и контроль
тут либо есть уровень понимания, либо нет ... ну или нигилизм и пофигизм ... имо
Пользователь
Сообщений: Регистрация: 19.04.2020
23.04.2020 10:48:54
Цитата
Anton написал: Верните из OnStop 72 часа и завершайтесь сколько влезет.
простите, я не знал, что сдесь форум специалистов по костылям. вам вопрос "со звездочкой": если другая библиотека, не ваша, выкинула ошибку, спровоцировала панику, куда отправляется ваш способ?
Цитата
новичок написал: lua это про стандарты, оптимальность и контроль
вы это серьезно? луа в квике это про стандарты и контроль? я не ослышался? да половину библиотек нельзя использовать с квиком без ограничений из-за того, что луа в квике нестандартная.
Пользователь
Сообщений: Регистрация: 27.08.2018
23.04.2020 12:35:40
Цитата
rst9 написал: луа в квике это про стандарты и контроль?
где в этой фразе про квик? :)
"все буквы угадал, но слово не назвал .." (с) выглядит как спор ради спора.
либо вычитывайте суть, либо как хотите :)
Пользователь
Сообщений: Регистрация: 19.04.2020
23.04.2020 12:56:51
так вы не lua используете, а qlua. считайте другой язык. lua - да, у нее много преимуществ а qlua - совсем другое, это диалект, у нее другие свойства, частичная совместимость...
Пользователь
Сообщений: Регистрация: 21.08.2015
23.04.2020 14:41:58
Цитата
rst9 написал: вам вопрос "со звездочкой": если другая библиотека, не ваша, выкинула ошибку, спровоцировала панику
Это как? Мой скрипт сидит в квике в отдельной луа-машине. Если я не умею обрабатывать ошибки в своей либе, то да, мне не надо потоков запускать, и, по-хорошему, вообще библиотек писать не надо, а надо улицы подметать.
Пользователь
Сообщений: Регистрация: 27.08.2018
23.04.2020 14:49:34
Цитата
rst9 написал: так вы не lua используете, а qlua. считайте другой язык. lua - да, у нее много преимуществ а qlua - совсем другое, это диалект, у нее другие свойства, частичная совместимость...
беда у вас с логикой. темой изначально был выбор lua vs python еще старайтесь :)
Пользователь
Сообщений: Регистрация: 19.04.2020
23.04.2020 15:49:29
у вас беда с глазами. изначально темой была ошибка при создании при помощи luaL_newstate(). а питон я вспомнил в контексте перекурочивания lua и превращения его в поделие qlua. попробуйте треды позапускайте в корутинах обычной lua, я на вас посмотрю.
Пользователь
Сообщений: Регистрация: 19.04.2020
23.04.2020 16:06:54
Цитата
Anton написал: Если я не умею обрабатывать ошибки в своей либе, то да, мне не надо потоков запускать, и, по-хорошему, вообще библиотек писать не надо, а надо улицы подметать.
ок, раз вы такой гуру... можете сделать библиотеку, которая будет реализовывать одну (две, минимальное количество) функций, которые будут позволять написать что-то вроде:
Код
tlib = require "mylib"
function threadfunc(astr)
message(astr, 1);
while true do
--
end
end
function main()
thread = tlib.CreateThread(threadfunc, "hello, world from thread")
while true do
--
end
end
и попробуйте сделать так, чтобы квик не валился при остановке скрипта, что бы пользователь внутри (хотя бы на lua, оставим за скобкой чужой код в библиотеках) не написал.
не, серьезно, я вас не поддеть хочу. я попытался, у меня вышло средне. если погуглите - найдете даже репу, она MIT.
А вы можете сделать такую же библиотеку на сях? Ну то есть вы стартанули тред, вызвали в нем произвольную юзерскую функцию и... как вы будете его останавливать, если понадобится? При чем тут квик, при чем тут луа, в такой форме задача не решается нигде.
Пользователь
Сообщений: Регистрация: 30.01.2015
23.04.2020 16:24:27
Гопода, это тема про ошибки в Квик 8.5, что весьма актуально. А вот обучение многопоточному программированию, думается, можно провести в другом месте.
Пользователь
Сообщений: Регистрация: 19.04.2020
23.04.2020 16:31:48
Цитата
quio написал: Гопода, это тема про ошибки в Квик 8.5, что весьма актуально
эту тему начал я, и арка уже отписалась, что решат проблему после дождичка в четверг. если у вас другая проблема, нежели в 1 сообщении - создайте новую тему, посвященную ей.
Цитата
Anton написал: При чем тут квик, при чем тут луа, в такой форме задача не решается нигде.
так уж нигде? ответ - операционная система. :) если я - хост вашей либы и либа стартанула тред (я, к примеру, знаю, что либа может стартануть тред), то, по факту, я могу.
о-о-о... как все запущено. навскидку знаю несколько способов 1. toolhelp/psapi/whatever 2. виртуализация 3. отладка ... кстати, в lua я решал эту проблему через отладку.
Пользователь
Сообщений: Регистрация: 27.08.2018
23.04.2020 16:44:43
Цитата
rst9 написал: у вас беда с глазами. изначально темой была ошибка при создании при помощи luaL_newstate(). а питон я вспомнил в контексте перекурочивания lua и превращения его в поделие qlua. попробуйте треды позапускайте в корутинах обычной lua, я на вас посмотрю.
изначально ошибка в том, что вы чужой серый ящик пытаетесь просверлить неодобрительным взглядом
у меня нет ни времени, ни желания погружаться в чужие головоломки. зачем?
этот кое-как фронтенд подходит для кое-каких действий требовать от микро-луа-машины победы в формуле это еще тот закидон всё что тут криво или не работает нужно сделать самому на сях
а глаза - да, надо бы закапывать иногда. купил уже средство :)
никто. если я запускаю вас в своем сендбоксе, то я тупо уничтожу сендбокс. ровно так как поступает квик при тайм-ауте. делает killthread() и уничтожает luavm.
Пользователь
Сообщений: Регистрация: 19.04.2020
23.04.2020 17:11:40
Цитата
Anton написал: При чем тут квик, при чем тут луа, в такой форме задача не решается нигде.
говорю вам, напишите. я предлагаю вам challenge. возможно, у вас получится лучше, чем у меня:
и, кстати, арка текнолоджис, у меня вам предложение: может вы сделаете апи для тредов, раз уж вы все равно родили диалект lua под названием qlua?
ЧТД, задача не решается нигде. Просто киллнуть тред - не стоило и разговор затевать, все и так это умеют. А хэндлы у вас тоже в сандбоксе? При некоторой удаче вы всю винду так свалите, не то что хост свой.
вы глупый что ли? мне не нужно вызывать ваши дуструкторы, если я могу просто виртуализировать для вас аллокатор памяти и убить все скопом не разбираясь.
Пользователь
Сообщений: Регистрация: 19.04.2020
23.04.2020 17:19:19
вы никогда не видели vmware что ли? нигде у него не решается...
Пользователь
Сообщений: Регистрация: 21.08.2015
23.04.2020 17:20:02
Цитата
rst9 написал: мне не нужно вызывать ваши дуструкторы, если я могу просто виртуализировать для вас аллокатор памяти
Мдеее. Виртуализируйте. Всю винду виртуализируйте только.
Anton написал: я очень меркантильный, даром только на форуме тявкаю
вы полагаете, что ваши знания чего-то стоят... удачи вам.
Пользователь
Сообщений: Регистрация: 23.01.2015
24.04.2020 07:34:53
Цитата
rst9 написал: и, кстати, арка текнолоджис, у меня вам предложение: может вы сделаете апи для тредов, раз уж вы все равно родили диалект lua под названием qlua?
Опишите более развернуто что именно Вы хотите получить
Пользователь
Сообщений: Регистрация: 19.04.2020
24.04.2020 22:46:33
Цитата
Sergey Gorokhov написал: Опишите более развернуто что именно Вы хотите получить
например, что-то подобное... LUA:
Код
function threadfunc(...)
while not CuttentThreadTerminated do
--
end
end
thread = CreateThread(threadfunc, ...)
thread.TerminateThread()
thread.Join()
thread = nil
collectgarbage()
Пользователь
Сообщений: Регистрация: 01.07.2019
05.05.2020 15:30:29
Здравствуйте.
Как Вы подключаете dll ?
Остановился тут //=== Регистрация названия библиотеки, видимого в скрипте Lua ==================================================// extern "C" LUALIB_API int luaopen_mylib_8_5(lua_State *L) { luaL_openlib(L, "mylib_8_5", ls_lib, 0); return 0; }
VS Выдает ошибку Ошибка 1 error C3861: luaL_openlib: идентификатор не найден
Как это исправить?
Пользователь
Сообщений: Регистрация: 30.01.2015
05.05.2020 16:12:36
static const struct luaL_Reg lib_functions[] = { // список функций тут
написал: Опишите более развернуто что именно Вы хотите получить
например, что-то подобное... LUA:
Код
function threadfunc ( .. .)
while not CuttentThreadTerminated do
--
end
end
thread = CreateThread(threadfunc, .. .)
thread.TerminateThread ()
thread.Join ()
thread = nil
collectgarbage()
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Пользователь
Сообщений: Регистрация: 01.07.2019
05.05.2020 16:26:47
Спасибо за помощь, s_mike, но не получается все равно.
Ошибка 1 error LNK1561: точка входа должна быть определена
У меня следующий код:
Код
#include <windows.h>
//=== Необходимые для Lua константы ============================================================================//
#define LUA_LIB
#define LUA_BUILD_AS_DLL
//=== Заголовочные файлы LUA ===================================================================================//
extern "C" {
#include "Lua\lauxlib.h"
#include "Lua\lua.h"
}
//=== Стандартная точка входа для DLL ==========================================================================//
BOOL APIENTRY DllMain(HANDLE hModule, DWORD fdwReason, LPVOID lpReserved)
{
//Каждому событию соответствует свое значение аргумента fdwReason, передаваемого функции DllMain при его возникновении
switch (fdwReason)
{
case DLL_PROCESS_ATTACH: // Подключение DLL
break;
case DLL_PROCESS_DETACH: // Отключение DLL
break;
case DLL_THREAD_ATTACH: // Создание нового потока
break;
case DLL_THREAD_DETACH: // Завершение потока
break;
}
return TRUE;
}
//=== Реализация функций, вызываемых из LUA ====================================================================//
static int forLua_TestFunc(lua_State *L)// Возвращает заданный текст
{
lua_pushstring(L, "Привет из C/C++");
return(1);
}
//=== Регистрация реализованных в dll функций, чтобы они стали "видимы" для Lua ================================//
static struct luaL_Reg ls_lib[] = {
{ "TestFunc", forLua_TestFunc },
{ NULL, NULL }
};
//=== Регистрация названия библиотеки, видимого в скрипте Lua ==================================================//
extern "C" LUALIB_API int luaopen_mylib(lua_State *L) {
lua_newtable(L);
luaL_setfuncs(L, ls_lib, 0);
lua_pushvalue(L, -1);
lua_setglobal(L, "mylib");
return 0;
}
Пользователь
Сообщений: Регистрация: 30.01.2015
05.05.2020 16:29:17
Смотрите в проект. Вам нужно собирать static dll, а вы собираете что то другое, похоже.