quik 8.5 ошибка

Страницы: Пред. 1 2 3 След.
RSS
quik 8.5 ошибка
 
Цитата
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 конфигурацией. Мы исправим конфигурацию в ближайшем обновлении ПО.
 
Цитата
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
Вот пример для воспроизведения:

Код
extern "C" LUALIB_API int luaopen_mylib(lua_State *L)
{
  lua_getglobal(L, "message");
  lua_pushstring(L, "test1");
  lua_pushnumber(L, 1);
  lua_call(L, 2, 1); // lua_callk(n, 2, 1, 0, NULL);
  lua_pop(L, 1);

  lua_State *n = lua_newthread(L);

  lua_getglobal(n, "message");
  lua_pushstring(n, "test2");
  lua_pushnumber(n, 1);
  lua_call(n, 2, 1); // lua_callk(n, 2, 1, 0, NULL);
  lua_pop(n, 1);

  return 0;
}

В Квик 8.4 выводится два сообщения, в Квик 8.5 только "test1".
 
Цитата
quio написал:
Именно так и сделано в штатном файле lua.h из Lua 5.3.5 - lua_call является вызовом lua_callk
Да именно и Вам у Вас в Вашем коде надо сделать также, либо использовать только lua_callk
 
Цитата
Sergey Gorokhov написал:
Да именно и Вам у Вас в Вашем коде надо сделать также, либо использовать только lua_callk

Вот, пожалуйста:
Код
#define lua_call(L,n,r)   lua_callk(L, (n), (r), 0, NULL)

extern "C" LUALIB_API int luaopen_mylib(lua_State *L)
{
  lua_getglobal(L, "message");
  lua_pushstring(L, "test1");
  lua_pushnumber(L, 1);
  lua_call(L, 2, 1);
  lua_pop(L, 1);

  lua_State *n = lua_newthread(L);

  lua_getglobal(n, "message");
  lua_pushstring(n, "test2");
  lua_pushnumber(n, 1);
  lua_call(n, 2, 1);
  lua_pop(n, 1);

  return 0;
}
В Квик 8.4 выводится два сообщения, в Квик 8.5 только "test1".
 
quio,
А если использовать именно lua_callk?
 
Цитата
Sergey Gorokhov написал:
А если использовать именно lua_callk?
Тоже самое (lua_call это и есть lua_callk).
 
Цитата
quio написал:
Цитата
Sergey Gorokhov написал:
А если использовать именно lua_callk?
Тоже самое (lua_call это и есть lua_callk).

т.е. вы хотите сказать что при вызове именно так
lua_callk(L, 2, 1, 0, NULL);
и не работает?
 
Цитата
Sergey Gorokhov написал:
т.е. вы хотите сказать что при вызове именно такlua_callk(L, 2, 1, 0, NULL); и не работает?
Да, именно это я и хочу сказать. Не пойму, мне код что ли нужно с раскрытым макросом привести? Пожалуйста:

Код
extern "C" LUALIB_API int luaopen_mylib(lua_State *L)
{
  lua_getglobal(L, "message");
  lua_pushstring(L, "test1");
  lua_pushnumber(L, 1);
  lua_callk(L, 2, 1, 0, NULL);
  lua_pop(L, 1);

  lua_State *n = lua_newthread(L);

  lua_getglobal(n, "message");
  lua_pushstring(n, "test2");
  lua_pushnumber(n, 1);
  lua_callk(n, 2, 1, 0, NULL);
  lua_pop(n, 1);

  return 0;
}
 
quio,
проблема изучается. Постараемся в ближайшее время дать ответ.
 
Цитата
Latrop написал:
Примитивная  dll  в  OnAllTrade  просто дергать напр getInfoParam("VERSION") и больше вообще ничего, никаких эксепшенов, но после коннекта и получения прим 50-100 тыс тиков валится:

Critical error ACCESS_VIOLATION in script...

Что это за беда такая может быть?...

Если в OnAllTrade вообще ничего не делать, пустышка, то не падает. Но такой способ обхода проблемы не очень подходит :)

Добрый день,

К сожалению, нам не удалось по присланным данным воспроизвести ошибку. Если это возможно, пришлите пример кода, работа с которым приводит к сбою.
 
Цитата
quio написал:
Вот пример для воспроизведения
подскажите, а для чего вообще вы хотите запускать корутины как треды в lua? это небезопасно и неуправляемо. не лучше ли использовать для этого разные скрипты?
 
Цитата
rst9 написал:
для чего вообще вы хотите запускать корутины как треды в lua?
Для выполнения работы, требующей блокировки нативного потока.

Цитата
rst9 написал:
это небезопасно и неуправляемо
В чем это заключается?

Цитата
rst9 написал:
не лучше ли использовать для этого разные скрипты?
По отдельной программе вместо нескольких потоков в одной? А если этим потокам нужно взаимодействовать? А если их количество меняется динамически?
 
Цитата
quio написал:
Цитата
Sergey Gorokhov написал:
т.е. вы хотите сказать что при вызове именно такlua_callk(L, 2, 1, 0, NULL); и не работает?
Да, именно это я и хочу сказать. Не пойму, мне код что ли нужно с раскрытым макросом привести? Пожалуйста:

Код
  extern  "C"  LUALIB_API int luaopen_mylib(lua_State  * L)
{
  lua_getglobal(L,  "message" );
  lua_pushstring(L,  "test1" );
  lua_pushnumber(L,  1 );
  lua_callk(L,  2 ,  1 ,  0 , NULL);
  lua_pop(L,  1 );

  lua_State  * n  =  lua_newthread(L);

  lua_getglobal(n,  "message" );
  lua_pushstring(n,  "test2" );
  lua_pushnumber(n,  1 );
  lua_callk(n,  2 ,  1 ,  0 , NULL);
  lua_pop(n,  1 );

   return   0 ;
}
  
Добрый день.

Действительно, стейтменты созданные через lua_newthread работают некорректно. Исправим в ближайшем обновлении ПО.
 
Цитата
quio написал:
В чем это заключается?
ну, в том, что если квик завершит работу вашего скрипта, то про ваши потоки он ничего не знает, и если они не успели остановиться - то все, привет. можно ухищряться, я делал через и отладку, и через сборщик мусора, но все равно, это невозможно сделать нормально. а, кроме того, это работает только для квика, а не вообще в lua. им нужно было питон встраивать, а не lua, не было бы проблем.
Цитата
quio написал:
А если этим потокам нужно взаимодействовать?
например, так: https://github.com/untoxa/lua_share между квиками она тоже умеет.
 
Цитата
rst9 написал:
в том, что если квик завершит работу вашего скрипта, то про ваши потоки он ничего не знает, и если они не успели остановиться - то все, привет
Конечно, не знает. Скрипт сам долежен корректно завершать свои потоки, что он у меня успешно и делает.
Выбор Lua в качестве интерпретатора скриптов, на мой взгляд, было отличным решением разработчиков. Этот язык прекрасно подходит для задач, для которых он там используется. Раньше немного расстраивало, что версия языка использована устаревшая. Главное, что бы он работал без глюков. Ну и хотелось бы более глубокой интеграции.

В частности до сих пор (8.4) часто бывает невозможно заказать обезличенные сделки, если не открыта таблица обезличенных сделок. Почему-то этот косяк все никак не устранят.
 
Цитата
rst9 написал:
им нужно было питон встраивать, а не lua, не было бы проблем.
проблем было бы больше в разы
lua идеален для встраивания. это точно грамотный выбор и не только в АРКА.

вот если бы еще давали своих клиентов к их серверам коннектить за маленькие пятачки было бы вапще шоколадно
но это фантастика , тк нифига не омерика :)
 
lua машина - принципиально однопоточная, за счет этого она такая быстрая и легкая. то, что ее для квика перелопатили так, чтобы она не валилась при вызове из разных потоков - решение спорное, качество этих доработок неизвестно (ну, точнее, известно, и оно так себе). питон точно такой же расширяемый язык и он от рождения нормально переваривает треды. да, там есть gil, но чтобы lua стала многопоточной, в нее добавили такой же gil, только хуже и сделанный на коленке.
 
Цитата
quio написал:
Скрипт сам долежен корректно завершать свои потоки, что он у меня успешно и делает.
это вы так думаете. тормозните тред, чтобы он не успел завершиться до истечения паузы на завершение скрипта, и посмотрите, что будет.
 
Цитата
rst9 написал:
это вы так думаете. тормозните тред, чтобы он не успел завершиться до истечения паузы на завершение скрипта, и посмотрите, что будет.
Зачем вот людей запугивать ) Верните из OnStop 72 часа и завершайтесь сколько влезет.
 
Цитата
rst9 написал:
питон точно такой же расширяемый язык и он от рождения нормально переваривает треды.
это холивар уровня: что лучше - шарп или кресты.

про реализацию qlua vm всё может быть и так, но тут есть куда рости и есть контроль
lua это про стандарты, оптимальность и контроль

многочисленные примеры - и питон один из них - показывают, что безудержное развивание в интересах средних прогеров или вообще непрогеров приводит к потере всего, что нужно ценить и беречь: стандарты, оптимальность и контроль

тут либо есть уровень понимания, либо нет ... ну или нигилизм и пофигизм ... имо
 
Цитата
Anton написал:
Верните из OnStop 72 часа и завершайтесь сколько влезет.
простите, я не знал, что сдесь форум специалистов по костылям. вам вопрос "со звездочкой": если другая библиотека, не ваша, выкинула ошибку, спровоцировала панику, куда отправляется ваш способ?
Цитата
новичок написал:
lua это про стандарты, оптимальность и контроль
вы это серьезно? луа в квике это про стандарты и контроль? я не ослышался? да половину библиотек нельзя использовать с квиком без ограничений из-за того, что луа в квике нестандартная.
 
Цитата
rst9 написал:
луа в квике это про стандарты и контроль?
где в этой фразе про квик? :)

"все буквы угадал, но слово не назвал .." (с)
выглядит как спор ради спора.

либо вычитывайте суть, либо как хотите :)
 
так вы не lua используете, а qlua. считайте другой язык. lua - да, у нее много преимуществ а qlua - совсем другое, это диалект, у нее другие свойства, частичная совместимость...
 
Цитата
rst9 написал:
вам вопрос "со звездочкой": если другая библиотека, не ваша, выкинула ошибку, спровоцировала панику
Это как? Мой скрипт сидит в квике в отдельной луа-машине. Если я не умею обрабатывать ошибки в своей либе, то да, мне не надо потоков запускать, и, по-хорошему, вообще библиотек писать не надо, а надо улицы подметать.
 
Цитата
rst9 написал:
так вы не lua используете, а qlua. считайте другой язык. lua - да, у нее много преимуществ а qlua - совсем другое, это диалект, у нее другие свойства, частичная совместимость...
беда у вас с логикой.
темой изначально был выбор lua vs python
еще старайтесь :)
 
у вас беда с глазами. изначально темой была ошибка при создании при помощи luaL_newstate(). а питон я вспомнил в контексте перекурочивания lua и превращения его в поделие qlua. попробуйте треды позапускайте в корутинах обычной lua, я на вас посмотрю.
 
Цитата
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.
 
Цитата
rst9 написал:
можете сделать библиотеку
А вы можете сделать такую же библиотеку на сях? Ну то есть вы стартанули тред, вызвали в нем произвольную юзерскую функцию и... как вы будете его останавливать, если понадобится? При чем тут квик, при чем тут луа, в такой форме задача не решается нигде.
 
Гопода, это тема про ошибки в Квик 8.5, что весьма актуально. А вот обучение многопоточному программированию, думается, можно провести в другом месте.
 
Цитата
quio написал:
Гопода, это тема про ошибки в Квик 8.5, что весьма актуально
эту тему начал я, и арка уже отписалась, что решат проблему после дождичка в четверг. если у вас другая проблема, нежели в 1 сообщении - создайте новую тему, посвященную ей.
Цитата
Anton написал:
При чем тут квик, при чем тут луа, в такой форме задача не решается нигде.
так уж нигде? ответ - операционная система. :) если я - хост вашей либы и либа стартанула тред (я, к примеру, знаю, что либа может стартануть тред), то, по факту, я могу.
 
Цитата
rst9 написал:
то, по факту, я могу.
Ну тормозните тред, выполняющий это
Код
void myfunc(void)
{
    Sleep(INFINITE);
}
 
о-о-о... как все запущено. навскидку знаю несколько способов
1. toolhelp/psapi/whatever
2. виртуализация
3. отладка
...
кстати, в lua я решал эту проблему через отладку.
 
Цитата
rst9 написал:
у вас беда с глазами. изначально темой была ошибка при создании при помощи luaL_newstate(). а питон я вспомнил в контексте перекурочивания lua и превращения его в поделие qlua. попробуйте треды позапускайте в корутинах обычной lua, я на вас посмотрю.
изначально ошибка в том, что вы чужой серый ящик пытаетесь просверлить неодобрительным взглядом

у меня нет ни времени, ни желания погружаться в чужие головоломки. зачем?

этот кое-как фронтенд подходит для кое-каких действий
требовать от микро-луа-машины победы в формуле это еще тот закидон
всё что тут криво или не работает нужно сделать самому на сях

а глаза - да, надо бы закапывать иногда.  купил уже средство :)
 
Цитата
rst9 написал:
о-о-о... как все запущено
Угу, я тоже так думаю. Так занятнее, правда? А если это не строка, а что-нибудь поинтереснее? Кто деструкторы будет выполнять?
Код
void myfunc(void)
{
    std::string str("abracadabra");
    Sleep(INFINITE);
}
 
Цитата
Anton написал:
Кто деструкторы будет выполнять?
никто. если я запускаю вас в своем сендбоксе, то я тупо уничтожу сендбокс. ровно так как поступает квик при тайм-ауте. делает killthread() и уничтожает luavm.
 
Цитата
Anton написал:
При чем тут квик, при чем тут луа, в такой форме задача не решается нигде.
говорю вам, напишите. я предлагаю вам challenge. возможно, у вас получится лучше, чем у меня: https://github.com/untoxa/lua_threads

и, кстати, арка текнолоджис, у меня вам предложение: может вы сделаете апи для тредов, раз уж вы все равно родили диалект lua под названием qlua?    
 
Цитата
rst9 написал:
никто.
ЧТД, задача не решается нигде. Просто киллнуть тред - не стоило и разговор затевать, все и так это умеют. А хэндлы у вас тоже в сандбоксе? При некоторой удаче вы всю винду так свалите, не то что хост свой.
 
Цитата
rst9 написал:
я предлагаю вам challenge.
Не, спасибо, я очень меркантильный, даром только на форуме тявкаю, и то уже задумываюсь, что многовато чота.
 
Цитата
Anton написал:
ЧТД, задача не решается нигде.
вы глупый что ли? мне не нужно вызывать ваши дуструкторы, если я могу просто виртуализировать для вас аллокатор памяти и убить все скопом не разбираясь.
 
вы никогда не видели vmware что ли? нигде у него не решается...
 
Цитата
rst9 написал:
мне не нужно вызывать ваши дуструкторы, если я могу просто виртуализировать для вас аллокатор памяти
Мдеее. Виртуализируйте. Всю винду виртуализируйте только.
 
Цитата
Anton написал:
А хэндлы у вас тоже в сандбоксе?
конечно. прокси для хендлов.
 
Цитата
Anton написал:
я очень меркантильный, даром только на форуме тявкаю
вы полагаете, что ваши знания чего-то стоят... удачи вам.
 
Цитата
rst9 написал:
и, кстати, арка текнолоджис, у меня вам предложение: может вы сделаете апи для тредов, раз уж вы все равно родили диалект lua под названием qlua?    


Опишите более развернуто что именно Вы хотите получить
 
Цитата
Sergey Gorokhov написал:
Опишите более развернуто что именно Вы хотите получить
например, что-то подобное... LUA:
Код
function threadfunc(...)
    while not CuttentThreadTerminated do
        -- 
    end
end

thread = CreateThread(threadfunc, ...)
thread.TerminateThread()
thread.Join()
thread = nil
collectgarbage()
 
Здравствуйте.

Как Вы подключаете 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: идентификатор не найден

Как это исправить?
 
static const struct luaL_Reg lib_functions[] =
{
// список функций тут

{ NULL, NULL }
};

extern "C" LUALIB_API int luaopen_bot4sale64(lua_State *L)
{
lua_newtable(L);
luaL_setfuncs(L, lib_functions, 0);
lua_pushvalue(L, -1);
lua_setglobal(L, "bot4sale64");

return 1;
}
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
rst9 написал:
Цитата
Sergey Gorokhov написал:
Опишите более развернуто что именно Вы хотите получить
например, что-то подобное... LUA:
Код
   function   threadfunc ( .. .)
     while   not  CuttentThreadTerminated  do 
         --  
     end 
 end 

thread  =  CreateThread(threadfunc,  .. .)
 thread.TerminateThread ()
 thread.Join ()
thread  =   nil 
collectgarbage()
  
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
 
Спасибо за помощь, 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;
}
 
Смотрите в проект. Вам нужно собирать static dll, а вы собираете что то другое, похоже.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
Страницы: Пред. 1 2 3 След.
Читают тему
Наверх