Пример #1
0
        } /* FrameBytesOffsetsUpdateThreadTerminate */

        private void  UpdateFrameByteOffsets()
        {
            updateFrameByteOffsetsRunning = true;

            long lastByteOffset  = 0;
            int  lastScanLineRow = 0;
            int  scanLinesPerSec = 25000;

            while ((!eofReached) && (!updateFrameByteOffsetsTerminate))
            {
                BlockStart();
                int loopCount = 0;

                f.BaseStream.Seek(frameByteOffsets[largestKnowmFrameNum], SeekOrigin.Begin);

                byteOffsetNextRead = frameByteOffsets[largestKnowmFrameNum];
                lastScanLineNum    = largestKnowmFrameNum * ScanLinesPerFrame - 1;
                eof = false;

                while ((!eofReached) && (!updateFrameByteOffsetsTerminate) && (loopCount < 50) && (blockedCount < 1))
                {
                    //int linesRead = 0;
                    int linesRead = 1;
                    SkipNextScanLine();
                    while ((linesRead < ScanLinesPerFrame) && (!eof))
                    {
                        lastScanLineNum++;
                        linesRead++;
                        SkipNextScanLine();
                    }

                    if (eof)
                    {
                        eofReached = true;
                        eof        = false;

                        if (linesRead < 1)
                        {
                            largestKnowmFrameNum--;
                            f.BaseStream.Seek(frameByteOffsets[largestKnowmFrameNum], SeekOrigin.Begin);
                        }
                        else
                        {
                            try  { f.BaseStream.Seek(frameByteOffsets[largestKnowmFrameNum], SeekOrigin.Begin); }
                            catch (Exception)
                            {
                                largestKnowmFrameNum--;
                                f.BaseStream.Seek(frameByteOffsets[largestKnowmFrameNum], SeekOrigin.Begin);
                            }
                        }

                        byteOffsetNextRead = frameByteOffsets[largestKnowmFrameNum];
                        lastScanLineNum    = largestKnowmFrameNum * ScanLinesPerFrame - 1;
                    }
                    else
                    {
                        largestKnowmFrameNum++;

                        while (largestKnowmFrameNum >= frameByteOffsets.Length)
                        {
                            ExpeandFrameByteOffsets();
                        }

                        frameByteOffsets[largestKnowmFrameNum] = byteOffsetNextRead;
                        frameNumLastRead = largestKnowmFrameNum;
                        frameNumNextRead = largestKnowmFrameNum + 1;

                        if ((instrumentDataManager != null) && (history != null))
                        {
                            InstrumentData dataRowForFrame = new InstrumentData(instrumentDataManager.CurrentDataRow());

                            int frameNumPrev = largestKnowmFrameNum - RecordingRateNumSamplingFrames;
                            if (frameNumPrev < 0)
                            {
                                frameNumPrev = 0;
                            }

                            int scanLineRow     = largestKnowmFrameNum * ScanLinesPerFrame;
                            int scanLineRowPrev = frameNumPrev * ScanLinesPerFrame;
                            int scanLinesDelta  = scanLineRow - scanLineRowPrev + 1;

                            long byteOffset      = frameByteOffsets[largestKnowmFrameNum];
                            long byteOffsetPrev  = frameByteOffsets[frameNumPrev];
                            long byteOffsetDelta = byteOffset - byteOffsetPrev + 1;

                            double secsDelta      = (double)scanLinesDelta / (double)scanLinesPerSec;
                            double bytesDeltaMega = (double)byteOffsetDelta / 1000000.0;

                            double megPerSec = bytesDeltaMega / secsDelta;

                            dataRowForFrame.RecordingRate = (float)megPerSec;

                            lastScanLineRow = scanLineRow;
                            lastByteOffset  = byteOffset;

                            dataRowForFrame.Time = dataRowForFrame.CTDdate();

                            history.Add(dataRowForFrame);
                        }
                    }

                    loopCount++;
                }

                if (lastScanLineNum > largestKnownScanLine)
                {
                    largestKnownScanLine = lastScanLineNum;
                }

                BlockEnd();

                Thread.Sleep(10);
            }

            updateFrameByteOffsetsRunning = false;
        } /* UpdateFrameByteOffsetsForFrameNum */