Еще одна особенность SetTableNotificationCallback

Страницы: 1
RSS
Еще одна особенность SetTableNotificationCallback
 
Зависает Quik при обработке событий в таблице, если прямо в функции сделать цикл на проверку изменения заявки.

Порядок действий. Запускаем скрипт - открывается окно.
Двойной щелчок левой мыши по 1-й строчке таблицы - выставляется заявка
Еще двойной левой мыши - должна сняться заявка, но квик виснет из-за цикла проверки заявки в функции KillOrder()
Код
Account       = "7618xxx"       -- Код счета
CLASS_CODE    = "SPBFUT"      -- Код класса
SEC_CODE      = "VBZ9"        -- Код инструмента

trans_id = os.time()     -- Текущие дата и время в секундах хорошо подходят для уникальных номеров транзакций

IsRun = true 
firstRun = 0   -- флаг первого запуска
flag = 0

function main()
   while IsRun do
      
      if firstRun==0 then
         priceMin = getParamEx(CLASS_CODE, SEC_CODE, "PRICEMIN").param_value+0         -- Цена выставления заявки
         CreateTable()
         firstRun=1
      end
      SetTableNotificationCallback(t_id, Touch) --ждем двойного щелчка мыши, чтобы выставить заявку или удалить
   end
end

function KillOrderS()
   local N = getNumberOf("orders")-1
   for i = N, 0 , -1 do
      order = getItem("orders", i)
      if order.account==Account and order.balance>0 and order.sec_code==SEC_CODE  and order.flags==25 then
         trans_id = os.time()
         local tkill = {
            ["CLASSCODE"]=CLASS_CODE,
            ["SECCODE"]=SEC_CODE,
            ["ACTION"]="KILL_ORDER",
            ["ACCOUNT"]=Account,
            ["TRANS_ID"]=tostring(trans_id),
            ["ORDER_KEY"]=tostring(order.order_num)
           }
         local res=sendTransaction(tkill)
         if res ~= '' then message('KillOrderS(): Ошибка отправки транзакции: '..res) else message('KillOrderS(): Транзакция отправлена') end
         sleep(5000)
         while getItem("orders", i).flags==25 do 
            message("flags = "..getItem("orders", i).flags)
            sleep(1000) 
         end
      end
   end
end

function Touch(t_id, msg, par1, par2)
   if msg==QTABLE_LBUTTONDBLCLK and par1==1 then
      local On Off = "Off"
      if flag==0 then
         flag = 1
         On Off = "On"
         SetColor(t_id, 1, 1, RGB(0,255,0), RGB(0,0,0), RGB(0,200,0), RGB(0,0,0));
         TransOpenPos() 
      else
         flag = 0
         SetColor(t_id, 1, 1, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR);
         KillOrderS()
      end
      SetCell(t_id, par1, par2, OnOff)
   end
end


function CreateTable()
   t_id = AllocTable();      -- Получает доступный id для создания
   AddColumn(t_id, 1, "ХЗ", true, QTABLE_CACHED_STRING_TYPE, 7);
   t = CreateWindow(t_id);    -- Создаем
   SetWindowCaption(t_id, "ХЗ");    -- Даем заголовок
   SetWindowPos(t_id, 0, 0, 100, 100)  -- Положение окна
   InsertRow(t_id, -1);  -- добавляем countLineFileSave строк
   SetCell(t_id, 1, 1, tostring(flag))
end


function TransOpenPos()
   trans_id = os.time() 
  local Transaction={
    ['TRANS_ID']  = tostring(trans_id),   -- Номер транзакции
    ['ACCOUNT']   = Account,              -- Код счета
    ['CLASSCODE'] = CLASS_CODE,           -- Код класса
    ['SECCODE']   = SEC_CODE,             -- Код инструмента
    ['ACTION']    = 'NEW_ORDER',          -- Тип транзакции ('NEW_ORDER' - новая заявка)
    ['OPERATION'] = 'B',                  -- Операция ('B' - buy, или 'S' - sell)
    ['TYPE']      = 'L',                  -- Тип ('L' - лимитированная, 'M' - рыночная)
    ['QUANTITY']  = '1',                  -- Количество
    ['PRICE']     = tostring(priceMin)   -- Цена
  }
  -- Отправляет транзакцию
  local Res = sendTransaction(Transaction)
  if Res ~= '' then message('TransOpenPos(): Ошибка отправки транзакции: '..Res) else message('TransOpenPos(): Транзакция отправлена') end
end

 
Было бы удивительно, если бы не зависал вот тут
Код
         while getItem("orders", i).flags==25 do 
            message("flags = "..getItem("orders", i).flags)
            sleep(1000) 
         end


 
Черт, отправилось раньше времени. У вас поток квика никогда ничего в таблицу не запишет, пока цикл while не закончится, а он не закончится, потому что пока вы из колбека не вернетесь, квик ничего в таблицах менять не будет.
 
Цитата
Anton написал:
Черт, отправилось раньше времени. У вас поток квика никогда ничего в таблицу не запишет, пока цикл while не закончится, а он не закончится, потому что пока вы из колбека не вернетесь, квик ничего в таблицах менять не будет.
Спасибо :-)
Значит это относиться ко всем колбекам.
Страницы: 1
Читают тему
Наверх