Beispiel #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();
        }
Beispiel #2
0
        public void SendFramesToFirst(object obj)
        {
            _sentFrames = new BitArray[SecondBuffer.FRAMESCOUNT];
            GenerateSomeFrames();

            _mainSemaphore.WaitOne();
            _postFrame = (PostDataToFirstBufferWt)obj;


            _postFrame(_sentFrames);
            ConsoleHelper.WriteToConsole("станция 2", "отправил кадры буферу 1");
            _signalToFirstBuffer.Release();

            _signalFromFirstBuffer.WaitOne();
            ConsoleHelper.WriteToConsoleArray("станция 2 полученная квитанция", _receivedReceipt);
            _mainSemaphore.Release();
        }