/* Функция синхронного сбора данных. Выполняется в отдельном потоке */ private void threadFunc() { reqStop = false; /* запускаем синхронные потоки ввода-вывода*/ lpcie.Errs err = hnd.StreamsStart(); if (err == lpcie.Errs.OK) { /* выполняем прием пока не произойдет ошибка или * не будет запроса на останов от основного приложения */ while (!reqStop && (err == lpcie.Errs.OK)) { /* принимаем данные синхронного ввода */ Int32 rcv_size = hnd.Recv(rcv_buf, RECV_BUF_SIZE, RECV_TOUT); /* значение меньше нуля означает ошибку... */ if (rcv_size < 0) { err = (lpcie.Errs)rcv_size; } else if (rcv_size > 0) { /* если больше нуля - значит приняли новые данные */ dinSize = RECV_BUF_SIZE; adcSize = RECV_BUF_SIZE; /* получаем номер лог. какнала, соответствующий первому * отсчету АЦП, так как до этого могли обработать * некратное количество кадров */ firstLch = hnd.NextExpectedLchNum; /* разбираем данные на синхронный ввод и отсчеты АЦП и * переводим АЦП в Вольты */ err = hnd.ProcessData(rcv_buf, (uint)rcv_size, X502.ProcFlags.VOLT, adcData, ref adcSize, dinData, ref dinSize); if (err == lpcie.Errs.OK) { /* обновляем значения элементов управления */ UpdateData(); } } } /* по выходу из цикла отсанавливаем поток. * Чтобы не сбросить код ошибки (если вышли по ошибке) * результат останова сохраняем в отдельную переменную */ lpcie.Errs stop_err = hnd.StreamsStop(); if (err == lpcie.Errs.OK) { err = stop_err; } } /* завершаем поток */ finishThread(err); }