Сбор данных в реальном времени в C #, что позволит избежать сбора мусора с помощью взаимодействия - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь собрать данные с устройства USB, используя оболочку DLL C # из FTDI (D3XX.NET). В частности, я непрерывно собираю 65536 образцов. Каждая коллекция из 65536 образцов использует метод ReadPipe и занимает 8,5 мс. После сбора я немедленно сигнализирую другой поток, используя WaitHandle (0,2 мкс), чтобы он мог обработать данные, а затем собирающий поток снова делает ReadPipe. Дело в том, что следующий ReadPipe должен произойти в течение 0,5 мс, иначе данные будут потеряны. Это связано с тем, что устройство имеет внутренний буфер 4 КБ, заполнение которого занимает 0,5 мс. Теперь, на самом деле, происходит то, что в 2% случаев происходит сборка мусора, которая занимает в среднем 1,4 мс. Поэтому некоторые данные теряются. Вот код:

        while (keepGoing)
        {
            ftStatus = d3xxDevice.ReadPipe(0x84, myBuffer, 65536, ref bytesTransferred); //

            _wait.Set();
        }       

А в другой теме у меня есть _wait.WaitOne (). Код в этом другом потоке будет выполнен менее чем за 10 миллисекунд, так что это не проблема. То, что я хотел бы сделать, и я пока не знаю, как сделать так, чтобы поток C ++ работал в другой библиотеке DLL, которая может ссылаться на ReadPipe из библиотеки FTDI, а затем, когда закончит чтение 65536 примеров, выполните _wait.Set (), чтобы позволить управляемому потоку обрабатывать результаты. Таким образом, весь сбор происходит с помощью неуправляемого кода и не будет замедлен сборкой мусора. Итак, вот резюме:

1) Вызовите функцию в моей собственной C ++ DLL, которая запустит поток.

2) Поток C ++ запускается и делает ReadPipe из 65536 сэмплов из библиотеки FTDI.

3) Когда сбор образцов завершен, этот поток выполняет эквивалент _wait.Set (), чтобы позволить потоку обработки выполнять свою работу.

4) Этот поток C ++ немедленно снова выдает ReadPipe.

Так можно ли это сделать? Как бы я вызвал метод FTDI ReadPipe из моей DLL? Как бы я сделал _wait.Set ()? Буду ли я использовать другой механизм, чтобы сигнализировать о потоке C # для продолжения?

Спасибо за понимание и помощь (я пока не знаю C ++). Том

...