А как форматировали код Pascal программы? Подсветка ключевых слов?
Форматировал код - ручками. То есть если вставить код в <pre><code>код</code></pre>
- пробелы не убивает. И маркдаун уже сам создаёт оба этих блока (но для инлайн кода, то есть (`код`) - блок pre
не создаётся, он там не нужен).
А подсветка - это всего лишь немного магического регекс-говнокода. Вот этот код.
Сразу над ним - код, заставляющий работать спойлеры. К примеру вот кусок со страницы Очередь >> Создание очередей
:
:::spoiler { summary="1. Из буфера/kernel-а" hidden=true }
... (тут содержимое скрываемого блока)
:::
А под кодом подсветки особых слов - то что я пару часов назад добавил, подсветка скобок.
Дождался-таки)
В целом всё наконец достаточно стабильно работает, так что создал пулл:
Кому не лень - продитесь по справкам, проверьте на орфографию и т.п.
@ProMix давайте лучше тут обсуждать, а то к трёхмерногому образу это не относится…
Важнее какая битность видеокарты… Вот эта программа её выведет:
uses OpenCLABC;
begin
Context.Default.MainDevice
.Properties.AddressBits
.ToString.Println;
end.
А если и тут 64 скажет - значит таки во всех программах с double
или int64
нужна своя строчка #pragma
…
Вообще уже было такое что реализация на моей NVidia тупо молчит о предупреждении, в том время как другие реализации дают ошибку вместо этого предупреждения.
А вот это уже больно… Через 40 мин. смогу нормально сесть и давать инструкции как отдебажить эту проблему.
Можете пока попробовать найти минимальный код с которым воспроизводится. Это сильно упростит весь дебаг далее.
Нет, эта ошибка значит что программа пыталась использовать область памяти, которая ей уже не принадлежит, потому что была освобождена. При работе с неуправляемым кодом таки баги повсюду… Но ловить их от этого не легче.
Да, 32
uses OpenCLABC;
const W = 2;
begin
var B := new Buffer(W*W*sizeof(real));
B.WriteArray2&<real>(MatrRandomReal(W,W).Println);
var BRes := new Buffer(B.Size);
var code := new ProgramCode(Context.Default, ReadAllText('2D.cl'));
var k := code['CalcTick'];
var Q_1Cycle: CommandQueueBase := k.NewQueue
// Сначала читаем предыдущее состояние из B и пишем BRes
.AddExec2(W,W,
B, BRes,
KernelArg.FromRecord(W)
)
// А затем то же самое в обратную сторону
.AddExec2(W,W,
BRes, B,
KernelArg.FromRecord(W)
);
Context.Default.SyncInvoke(Q_1Cycle);
end.
Как-то так. Интересный факт, если закомментировать оба .AddExec2 после k.NewQueue то ошибка не выводится
А если закомментировать только второй всё ещё выводится?
Замените OpenCLABCBase.pas
на этот: OpenCLABCBase.pas (143.4 КБ)
И добавьте в конец программы:
EventDebug.ReportRefCounterInfo;
Вам выведет кучу дебаг информации, скиньте её мне.
Перестаёт выводится только в случае комментирования обоих
OpenCLABC.pas(479) : Неизвестное имя 'ConvSyncQueueArray2'
Ах, ну да… Это я недоупакованную версию скинул.
OpenCLABCBase.pas (350.2 КБ)
Ну тогда минимальный код это таки без второй AddExec
.
2DTest.pas(28) : Неизвестное имя 'EventDebug'
Без него всё ещё не работает
А ну и OpenCLABCBase
надо указать в uses
.
А ошибку точно ту же выдаёт?
Необработанное исключение: System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
в OpenCL.cl.z_EnqueueMarkerWithWaitList_ovr_0(cl_command_queue command_queue, UInt32 num_events_in_wait_list, cl_event& event_wait_list, cl_event& event)
в OpenCL.cl.EnqueueMarkerWithWaitList(cl_command_queue command_queue, UInt32 num_events_in_wait_list, cl_event[] event_wait_list, cl_event& event) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCL.pas:строка 5319
в OpenCLABCBase.EventList.ToMarker(cl_context c, cl_device_id dvc, cl_command_queue& cq, Boolean expect_smart_status_err) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2057
в OpenCLABCBase.EventList.AttachCallback(Action work, CLTaskBase tsk, cl_context c, cl_device_id dvc, cl_command_queue& cq, String reason, Boolean save_err) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2123
в OpenCLABCBase.CommandQueue`1.Invoke(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2906
в OpenCLABCBase.CommandQueue`1.InvokeBase(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2909
в OpenCLABCBase.SimpleSyncQueueArray`1.InvokeImpl(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 3099
в OpenCLABCBase.CommandQueue`1.Invoke(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2905
в OpenCLABCBase.CommandQueue`1.InvokeBase(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2909
в OpenCLABCBase_implementation______.CLTaskResLess..ctor(CommandQueueBase q, Context c) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4570
в OpenCLABCBase.Context.BeginInvoke(CommandQueueBase q) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4675
в OpenCLABCBase.Context.SyncInvoke(CommandQueueBase q) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4678
в 2D.Program.$Main() в C:\Users\Миша\Downloads\Симуляция тепла\2D.pas:строка 73
в 2D.Program.Main()
Вроде та же
По моему вы запускаете не тот же код что дали тут.
SimpleSyncQueueArray
это тип очереди, который получается при сложении нескольких очередей (в том числе с помощью CombineSyncQueue
).
И вместо CLTaskResLess
был бы CLTask`1
, если бы вы передавали в SyncInvoke
результат .AddExec2
.
Это был изначальный код. Вот ошибка тестовой версии:
Необработанное исключение: System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
в OpenCL.cl.z_EnqueueMarkerWithWaitList_ovr_0(cl_command_queue command_queue, UInt32 num_events_in_wait_list, cl_event& event_wait_list, cl_event& event)
в OpenCL.cl.EnqueueMarkerWithWaitList(cl_command_queue command_queue, UInt32 num_events_in_wait_list, cl_event[] event_wait_list, cl_event& event) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCL.pas:строка 5319
в OpenCLABCBase.EventList.ToMarker(cl_context c, cl_device_id dvc, cl_command_queue& cq, Boolean expect_smart_status_err) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2057
в OpenCLABCBase.EventList.AttachCallback(Action work, CLTaskBase tsk, cl_context c, cl_device_id dvc, cl_command_queue& cq, String reason, Boolean save_err) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2123
в OpenCLABCBase.CommandQueue`1.Invoke(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2906
в OpenCLABCBase.CommandQueue`1.InvokeBase(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2909
в OpenCLABCBase_implementation______.CLTaskResLess..ctor(CommandQueueBase q, Context c) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4570
в OpenCLABCBase.Context.BeginInvoke(CommandQueueBase q) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4675
в OpenCLABCBase.Context.SyncInvoke(CommandQueueBase q) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4678
в 2DTest.Program.$Main() в C:\Users\Миша\Downloads\Симуляция тепла\2DTest.pas:строка 27
в 2DTest.Program.Main()
Только в минимальном коде и тестируйте, весь смысл этого кода - ограничить ошибку которую вы получаете от всего остального кода, чтоб легче было понять что именно к ней приводит.
Давайте попробуем ядерный вариант… Залезьте в CommandQueue<T>.Invoke
и влепите следующее:
Writeln(self.GetType);
EventDebug.ReportRefCounterInfo;
Readln;
Прямо перед последней строчкой, то есть перед AttachCallback
.
Затем запустите и медленно (раз в секунду) тыкайте Enter, пока ошибка не выпадет снова. И посылайте всё что попадёт в вывод.
OpenCLABCBase.ConstQueue`1[System.Double[,]]
========================================
OpenCLABCBase.BufferCommandQueue
Logging state change of cl_event[479826992]
1 | 00:00:00.0008398 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:
------------------------------
========================================
OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[479826992]
1 | 00:00:00.0008398 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:
1 | 00:00:00.0553328 | State changed when: Status of user ev set[it's True] to COMPLETE
0 | 00:00:03.1681703 | Released when: last ev of CLTask, together with evs: cl_event[479826992]
------------------------------
========================================
OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[479826992]
1 | 00:00:00.0008398 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:
1 | 00:00:00.0553328 | State changed when: Status of user ev set[it's True] to COMPLETE
0 | 00:00:03.1681703 | Released when: last ev of CLTask, together with evs: cl_event[479826992]
------------------------------
========================================
OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[479826992]
1 | 00:00:00.0008398 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:
1 | 00:00:00.0553328 | State changed when: Status of user ev set[it's True] to COMPLETE
0 | 00:00:03.1681703 | Released when: last ev of CLTask, together with evs: cl_event[479826992]
------------------------------
Logging state change of cl_event[479838432]
1 | 00:00:07.9125960 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on []
2 | 00:00:07.9136295 | Retained when: Tracking state change
------------------------------
========================================
OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[479826992]
1 | 00:00:00.0008398 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:
1 | 00:00:00.0553328 | State changed when: Status of user ev set[it's True] to COMPLETE
0 | 00:00:03.1681703 | Released when: last ev of CLTask, together with evs: cl_event[479826992]
------------------------------
Logging state change of cl_event[479838432]
1 | 00:00:07.9125960 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on []
2 | 00:00:07.9136295 | Retained when: Tracking state change
2 | 00:00:07.9172604 | State changed when: Set to COMPLETE
1 | 00:00:07.9173986 | Released when: Finished tracking state change
------------------------------
========================================
OpenCLABCBase.KernelCommandQueue
Logging state change of cl_event[479826992]
1 | 00:00:00.0008398 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:
1 | 00:00:00.0553328 | State changed when: Status of user ev set[it's True] to COMPLETE
0 | 00:00:03.1681703 | Released when: last ev of CLTask, together with evs: cl_event[479826992]
------------------------------
Logging state change of cl_event[479838432]
1 | 00:00:07.9125960 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on []
2 | 00:00:07.9136295 | Retained when: Tracking state change
2 | 00:00:07.9172604 | State changed when: Set to COMPLETE
1 | 00:00:07.9173986 | Released when: Finished tracking state change
------------------------------
Logging state change of cl_event[479838800]
1 | 00:00:11.2890673 | Retained when: Created for abortability of EventList.Combine of: cl_event[479838432]
1 | 00:00:11.2893235 | State changed when: Status of user ev set[it's True] to COMPLETE
------------------------------
Logging state change of cl_event[479839168]
1 | 00:00:11.2916428 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on [cl_event[479838432] cl_event[479838800]]
2 | 00:00:11.2916576 | Retained when: Tracking state change
------------------------------
========================================
Необработанное исключение: System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
в OpenCL.cl.z_EnqueueMarkerWithWaitList_ovr_0(cl_command_queue command_queue, UInt32 num_events_in_wait_list, cl_event& event_wait_list, cl_event& event)
в OpenCL.cl.EnqueueMarkerWithWaitList(cl_command_queue command_queue, UInt32 num_events_in_wait_list, cl_event[] event_wait_list, cl_event& event)
в OpenCLABCBase.EventList.ToMarker(cl_context c, cl_device_id dvc, cl_command_queue& cq, Boolean expect_smart_status_err)
в OpenCLABCBase.EventList.AttachCallback(Action work, CLTaskBase tsk, cl_context c, cl_device_id dvc, cl_command_queue& cq, String reason, Boolean save_err)
в OpenCLABCBase.CommandQueue`1.Invoke(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev)
в OpenCLABCBase.CommandQueue`1.InvokeBase(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev)
в OpenCLABCBase_implementation______.CLTaskResLess..ctor(CommandQueueBase q, Context c)
в OpenCLABCBase.Context.BeginInvoke(CommandQueueBase q)
в OpenCLABCBase.Context.SyncInvoke(CommandQueueBase q)
в 2DTest.Program.$Main()
в 2DTest.Program.Main()
Кхм, ок, задержка немного не там… Тогда замените те 3 строчки на это:
Writeln(self.GetType);
Sleep(1000);
EventDebug.ReportRefCounterInfo;
И, конечно, опять скиньте всё что выведет.
OpenCLABCBase.ConstQueue`1[System.Double[,]]
========================================
OpenCLABCBase.BufferCommandQueue
Logging state change of cl_event[481072176]
1 | 00:00:00.0005260 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:
1 | 00:00:00.0272097 | State changed when: Status of user ev set[it's True] to COMPLETE
------------------------------
========================================
OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[481072176]
1 | 00:00:00.0005260 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:
1 | 00:00:00.0272097 | State changed when: Status of user ev set[it's True] to COMPLETE
0 | 00:00:01.0245728 | Released when: last ev of CLTask, together with evs: cl_event[481072176]
------------------------------
========================================
OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[481072176]
1 | 00:00:00.0005260 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:
1 | 00:00:00.0272097 | State changed when: Status of user ev set[it's True] to COMPLETE
0 | 00:00:01.0245728 | Released when: last ev of CLTask, together with evs: cl_event[481072176]
------------------------------
========================================
OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[481072176]
1 | 00:00:00.0005260 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:
1 | 00:00:00.0272097 | State changed when: Status of user ev set[it's True] to COMPLETE
0 | 00:00:01.0245728 | Released when: last ev of CLTask, together with evs: cl_event[481072176]
------------------------------
Logging state change of cl_event[481081600]
1 | 00:00:03.1195387 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on []
2 | 00:00:03.1205947 | Retained when: Tracking state change
2 | 00:00:03.1250737 | State changed when: Set to COMPLETE
1 | 00:00:03.1252816 | Released when: Finished tracking state change
------------------------------
========================================
OpenCLABCBase.ConstQueue`1[System.Int32]
Logging state change of cl_event[481072176]
1 | 00:00:00.0005260 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:
1 | 00:00:00.0272097 | State changed when: Status of user ev set[it's True] to COMPLETE
0 | 00:00:01.0245728 | Released when: last ev of CLTask, together with evs: cl_event[481072176]
------------------------------
Logging state change of cl_event[481081600]
1 | 00:00:03.1195387 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on []
2 | 00:00:03.1205947 | Retained when: Tracking state change
2 | 00:00:03.1250737 | State changed when: Set to COMPLETE
1 | 00:00:03.1252816 | Released when: Finished tracking state change
------------------------------
========================================
OpenCLABCBase.KernelCommandQueue
Logging state change of cl_event[481072176]
1 | 00:00:00.0005260 | Retained when: Created for BackgroundWork, executing blocking enq of OpenCLABCBase_implementation______.BufferCommandWriteArray2AutoSize`1[System.Double], ev_l2 = [], after waiting on:
1 | 00:00:00.0272097 | State changed when: Status of user ev set[it's True] to COMPLETE
0 | 00:00:01.0245728 | Released when: last ev of CLTask, together with evs: cl_event[481072176]
------------------------------
Logging state change of cl_event[481081600]
1 | 00:00:03.1195387 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on []
2 | 00:00:03.1205947 | Retained when: Tracking state change
2 | 00:00:03.1250737 | State changed when: Set to COMPLETE
1 | 00:00:03.1252816 | Released when: Finished tracking state change
------------------------------
Logging state change of cl_event[481084032]
1 | 00:00:05.1982150 | Retained when: Created for abortability of EventList.Combine of: cl_event[481081600]
1 | 00:00:05.1986451 | StateНеобработанное исключение: System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
в OpenCL.cl.z_EnqueueMarkerWithWaitList_ovr_0(cl_command_queue command_queue, UInt32 num_events_in_wait_list, cl_event& event_wait_list, cl_event& event)
в OpenCL.cl.EnqueueMarkerWithWaitList(cl_command_queue command_queue, UInt32 num_events_in_wait_list, cl_event[] event_wait_list, cl_event& event) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCL.pas:строка 5319
в OpenCLABCBase.EventList.ToMarker(cl_context c, cl_device_id dvc, cl_command_queue& cq, Boolean expect_smart_status_err) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2072
в OpenCLABCBase.EventList.AttachCallback(Action work, CLTaskBase tsk, cl_context c, cl_device_id dvc, cl_comm changed when: Status of user ev set[it's True] to COMPLETE
------------------------------
Logging state change of cl_event[481084304]
1 | 00:00:05.2051949 | Retained when: Enq by OpenCLABCBase_implementation______.KernelCommandExec2, waiting on [cl_event[481081600] cl_event[481084032]]
2 | 00:00:05.2052125 | Retained when: Tracking state change
2 | 00:00:05.2980747 | State changed when: Set to COMPLETE
1 | 00:00:05.2980796 | Released when: Finished tracking state change
------------------------------
========================================
and_queue& cq, String reason, Boolean save_err) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2137
в OpenCLABCBase.CommandQueue`1.Invoke(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2930
в OpenCLABCBase.CommandQueue`1.InvokeBase(CLTaskBase tsk, Context c, cl_device_id main_dvc, Boolean need_ptr_qr, cl_command_queue& cq, EventList prev_ev) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 2934
в OpenCLABCBase_implementation______.CLTaskResLess..ctor(CommandQueueBase q, Context c) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4608
в OpenCLABCBase.Context.BeginInvoke(CommandQueueBase q) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4714
в OpenCLABCBase.Context.SyncInvoke(CommandQueueBase q) в C:\Users\Миша\Downloads\Симуляция тепла\OpenCLABCBase.pas:строка 4718
в 2DTest.Program.$Main() в C:\Users\Миша\Downloads\Симуляция тепла\2DTest.pas:строка 27
в 2DTest.Program.Main()
А и, на всяк, скиньте .cl файл как он у вас сейчас расписан. Вроде я его не менял после того как кинул (кроме #pragma
сегодня), ну мало ли…
Так а второй AddExec2
вы всё ещё не убрали, получается? Он мешается, потому что в логах выглядит очень похоже на первый. Уберите его и киньте вывод ещё раз. И ту вставку ещё немного поправьте:
Writeln(self.GetType);
Sleep(500);
EventDebug.ReportRefCounterInfo;
Sleep(500);
Так текст ошибки не должно накладывать поверх вывода…