Есть вот такой простенький код:
Код |
---|
IsRun = true
function TableCreate()
g_tid = AllocTable()
if (g_tid ~= nil) then
SetTableNotificationCallback(g_tid, OnTableEvent)
AddColumn(g_tid, 1, "Сообщение", true, QTABLE_STRING_TYPE, 100)
if (CreateWindow(g_tid)) then
SetWindowCaption(g_tid, "Таблица")
SetWindowPos(g_tid, 0, 0, 800, 200)
else
DestroyTable(g_tid)
g_tid = nil
end
end
end
function OnTableEvent(tid, msg, par1, par2)
PrintDbgStr("OnLogTableEvent enter")
PrintDbgStr("OnLogTableEvent leave")
end
function OnInit(script)
PrintDbgStr("OnInit enter")
TableCreate()
local row = InsertRow(g_tid, -1)
SetCell(g_tid, row, 1, "OnInit: Скрипт запущен.")
PrintDbgStr("OnInit leave")
end
function OnStop(signal)
PrintDbgStr("OnStop enter")
IsRun = false
local row = InsertRow(g_tid, -1)
SetCell(g_tid, row, 1, "OnStop: Скрипт остановлен.")
PrintDbgStr("OnStop leave")
end
function main()
PrintDbgStr("main enter")
local row = InsertRow(g_tid, -1)
SetCell(g_tid, row, 1, "main: Скрипт запущен.")
while (IsRun) do
sleep(500)
end
local row = InsertRow(g_tid, -1)
SetCell(g_tid, row, 1, "main: Скрипт остановлен.")
PrintDbgStr("main leave")
end
|
При его запуске в отладочную консоль выводятся строки:
Код |
---|
OnInit enter
OnInit leave
main enter |
Появляется окно с таблицей и в неё выводятся строки:
Код |
---|
OnInit: Скрипт запущен.
main: Скрипт запущен. |
До этого момента всё работает как надо. Если же далее остановить скрипт из диалога управления, то в консоль выводятся строки:
Код |
---|
OnStop enter
OnStop leave |
Далее окно диалога управления подвисает на 5 секунд. Откуда это время понятно, ожидание завершения потока функции main по умолчанию.
И только сейчас, по истечении этого времени в окне с таблицей появляется строка:
Код |
---|
OnStop: Скрипт остановлен.
|
хотя колл-бэк функция OnStop уже давно отработала, судя по выводу в консоли.
Строка
"main: Скрипт остановлен." в окне с таблицей не появляется совсем, т.к. и скорее всего поток main уже принудительно завершен. Соответственно и сообщение
"main leave" в консоли тоже не появляется.
Почему виснет очередь сообщений к окну таблицы при остановке скрипта? Как обработать такую ситуацию, если нужен вывод в пользовательскую таблицу по завершении потока main?