|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
13.11.2014, 11:51 | #1 |
Новичок
Джуниор
Регистрация: 13.11.2014
Сообщений: 4
|
CallbackOnCollectedDelegate was detected
Помогите решить проблему
Есть PCI плата и библиотека для упраления PCI-Dask.dll Есть пневмосистема, которая состоит из 24 пневмопушек. На каждой пневмопушке установлен датчик срабатывания. Есть форма с 24 кнопками и 24 textboxами. При нажатии одной из 24 кнопок срабатывает соответствующая пневмопушка. А в один из 24 textbox'ов выводится количество выстрелов от соответствующей пневмопушки. Но возникает следующая ошибка. CallbackOnCollectedDelegate was detected Message: A callback was made on a garbage collected delegate of type 'Pci7442!Pci7442.Card+Multidelegate ::Invoke'. This may cause application crashes, corruption and data loss. When passing delegates to unmanaged code, they must be kept alive by the managed application until it is guaranteed that they will never be called. Причем, возникает не сразу, а после примерно 40 нажатий на различные кнопки. Так же было замечено, что при стрельбе с отсутствием воздуха (датчики не срабатывают в этом случае), проблема не возникает. Возможно проблема методе GetDataFromDigitalInput() Код:
Последний раз редактировалось Stilet; 13.11.2014 в 12:39. |
13.11.2014, 16:55 | #2 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
По-моему тут вы что-то странное делаете.
Код:
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
14.11.2014, 12:27 | #3 |
Новичок
Джуниор
Регистрация: 13.11.2014
Сообщений: 4
|
Alex11223, моя ошибка, опрометчиво выкинул часть метода при форматировании, вот полный вариант. То есть при возникновении прерывания выполняется метод GetDataFromDigitalInpu(); который считывает состояния датчиков Pci7442.DIO_GetCOSLatchDataInt32(Ca rdPci7442, 0, out cosLData);
Код:
Последний раз редактировалось KonstantinLitvn; 14.11.2014 в 12:30. |
14.11.2014, 12:43 | #4 |
Новичок
Джуниор
Регистрация: 13.11.2014
Сообщений: 4
|
Я так понимаю, что при обратном вызове из неуправляемого кода сборщик мусора уничтожает ссылку callbackAddr на метод GetDataFromDigitalInput (Multidelegate callbackAddr = GetDataFromDigitalInput;)
|
14.11.2014, 12:43 | #5 | |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Цитата:
Наверно его просто полем этого класса сделать надо было, если InitCosInterrupt вызывается только один раз (ну или точнее если не вызывается пока текущий callbackAddr еще используется). А, точнее если там один и тот же GetDataFromDigitalInput, то наверно можно даже так: Код:
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. Последний раз редактировалось Alex11223; 14.11.2014 в 12:52. |
|
14.11.2014, 14:36 | #6 |
Новичок
Джуниор
Регистрация: 13.11.2014
Сообщений: 4
|
Да, это заработало, спасибо!
Но не совсем понял почему. |
14.11.2014, 14:39 | #7 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Чего непонятного? При завершении InitCosInterrupt нигде больше не остается ссылок на объект (если callbackAddr локальная переменная этого метода) и сборщик мусора его уничтожает.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
*** glibc detected *** double free or corruption | Stilet | Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) | 2 | 13.05.2014 20:50 |
GetDIBits пишет за буфеер => Heap corruption detected. | TwiX | Win Api | 2 | 16.11.2013 22:27 |
RAW audio finder (16 kB detected) | RibGeDx | Мультимедиа в Delphi | 1 | 03.02.2013 11:53 |
Ambiguous name detected: CommandButton2_Click | ramzes777 | Microsoft Office Excel | 3 | 23.12.2011 19:46 |
detected IDE drivers | nikox12 | Компьютерное железо | 1 | 02.05.2011 19:51 |