Ejemplo n.º 1
0
        static void Main(string[] args)
        {
            ConsoleHelper.WriteToConsole("Главный поток", "");


            Semaphore mainSemaphore               = new Semaphore(1, 1);
            Semaphore dataSignalToSecondBuffer    = new Semaphore(0, 1);
            Semaphore dataSignalToSecond          = new Semaphore(0, 1);
            Semaphore receiptSignalToSecondBuffer = new Semaphore(0, 1);
            Semaphore receiptSignalToFirst        = new Semaphore(0, 1);

            Semaphore dataSignalToFirstBuffer    = new Semaphore(0, 1);
            Semaphore dataSignalToFirst          = new Semaphore(0, 1);
            Semaphore receiptSignalToFirstBuffer = new Semaphore(0, 1);
            Semaphore receiptSignalToSecond      = new Semaphore(0, 1);


            FirstStation  firstStation  = new FirstStation(ref dataSignalToSecondBuffer, ref receiptSignalToFirst, ref receiptSignalToFirstBuffer, ref dataSignalToFirst, ref mainSemaphore);
            FirstBuffer   firstBuffer   = new FirstBuffer(ref dataSignalToFirstBuffer, ref dataSignalToFirst, ref receiptSignalToFirstBuffer, ref receiptSignalToSecond);
            SecondStation secondStation = new SecondStation(ref dataSignalToSecond, ref receiptSignalToSecondBuffer, ref dataSignalToFirstBuffer, ref receiptSignalToSecond, ref mainSemaphore);
            SecondBuffer  secondBuffer  = new SecondBuffer(ref dataSignalToSecondBuffer, ref dataSignalToSecond, ref receiptSignalToSecondBuffer, ref receiptSignalToFirst);


            Thread firstThread  = new Thread(new ParameterizedThreadStart(firstStation.SendFramesToSecond));
            Thread secondThread = new Thread(new ParameterizedThreadStart(secondBuffer.SendFramesToSecond));
            Thread thirdThread  = new Thread(new ParameterizedThreadStart(secondStation.SendReceiptToSecondBuffer));
            Thread forthThread  = new Thread(new ParameterizedThreadStart(secondBuffer.SendReceiptToFirst));

            Thread fifthThread   = new Thread(new ParameterizedThreadStart(secondStation.SendFramesToFirst));
            Thread sixthThread   = new Thread(new ParameterizedThreadStart(firstBuffer.SendFramesToFirst));
            Thread seventhThread = new Thread(new ParameterizedThreadStart(firstStation.SendReceiptToFirstBuffer));
            Thread eighthThread  = new Thread(new ParameterizedThreadStart(firstBuffer.SendReceiptToSecond));


            PostDataToSecondBufferWt    postDataToSecondBufferWt    = new PostDataToSecondBufferWt(secondBuffer.ReceiveFrames);
            PostDataToSecondWt          postDataToSecondWt          = new PostDataToSecondWt(secondStation.ReceiveFrames);
            PostReceiptToSecondBufferWt postReceiptToSecondBufferWt = new PostReceiptToSecondBufferWt(secondBuffer.ReceiveReceipt);
            PostReceiptToFirstWt        postReceiptToFirstWt        = new PostReceiptToFirstWt(firstStation.ReceiveReceipt);


            PostDataToFirstBufferWt    postDataToFirstBufferWt    = new PostDataToFirstBufferWt(firstBuffer.ReceiveFrames);
            PostDataToFirstWt          postDataToFirstWt          = new PostDataToFirstWt(firstStation.ReceiveFrames);
            PostReceiptToFirstBufferWt postReceiptToFirstBufferWt = new PostReceiptToFirstBufferWt(firstBuffer.ReceiveReceipt);
            PostReceiptToSecondWt      postReceiptToSecondtWt     = new PostReceiptToSecondWt(secondStation.ReceiveReceipt);


            firstThread.Start(postDataToSecondBufferWt);
            secondThread.Start(postDataToSecondWt);
            thirdThread.Start(postReceiptToSecondBufferWt);
            forthThread.Start(postReceiptToFirstWt);


            fifthThread.Start(postDataToFirstBufferWt);
            sixthThread.Start(postDataToFirstWt);
            seventhThread.Start(postReceiptToFirstBufferWt);
            eighthThread.Start(postReceiptToSecondtWt);


            Console.ReadLine();
        }
Ejemplo n.º 2
0
        public void SendReceiptToFirstBuffer(Object obj)
        {
            Stopwatch framesReceptionWatch = new Stopwatch();

            _postReceipt = (PostReceiptToFirstBufferWt)obj;
            _sentReceipt = new BitArray(1);

            framesReceptionWatch.Start();
            _signalFromFirstBuffer.WaitOne();
            framesReceptionWatch.Stop();
            TimeSpan framesReceptionTime = framesReceptionWatch.Elapsed;

            if (framesReceptionTime.Milliseconds > 20)
            {
                _sentReceipt[0] = false;
                ConsoleHelper.WriteToConsole("станция 1", "Данные не получены");
            }

            else
            {
                _sentReceipt[0] = true;
                for (int i = 0; i < _receivedFrames.Length; i++)
                {
                    if (ValidData(_receivedFrames[i]) == true)
                    {
                        ConsoleHelper.WriteToConsoleArray("станция 1 полученный кадр №" + i, _receivedFrames[i]);
                    }
                    else
                    {
                        ConsoleHelper.WriteToConsole("станция 1 полученный кадр №" + i, "данные повреждены");
                    }
                }
            }

            _postReceipt(_sentReceipt);
            ConsoleHelper.WriteToConsole("станция 1", "отправил квитанцию буферу 1");
            _signalToFirstBuffer.Release();
        }