Я пытаюсь собрать данные с устройства 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 ++).
Том