static void Main(string[] args) { ConsoleHelper.WriteToConsole("Главный поток", ""); Semaphore connectionSem = new Semaphore(1, 1); Semaphore disConnectionSem = new Semaphore(1, 1); Semaphore transmissionSem = new Semaphore(1, 1); Semaphore firstStToSecondBuf = new Semaphore(0, 1); Semaphore secondBufToSecondSt = new Semaphore(0, 1); Semaphore secondStToFirstSt = new Semaphore(0, 1); Semaphore secondStToFirstBuf = new Semaphore(0, 1); Semaphore firstBufToFirstSt = new Semaphore(0, 1); Semaphore firstStToSecondSt = new Semaphore(0, 1); FirstStation firstStation = new FirstStation(ref firstStToSecondBuf, ref firstBufToFirstSt, ref secondStToFirstSt, ref firstStToSecondSt, ref transmissionSem, ref connectionSem, ref disConnectionSem); FirstBuffer firstBuffer = new FirstBuffer(ref secondStToFirstBuf, ref firstBufToFirstSt); SecondStation secondStation = new SecondStation(ref secondBufToSecondSt, ref secondStToFirstBuf, ref firstStToSecondSt, ref secondStToFirstSt, ref transmissionSem, ref connectionSem, ref disConnectionSem); SecondBuffer secondBuffer = new SecondBuffer(ref firstStToSecondBuf, ref secondBufToSecondSt); Thread firstThread = new Thread(new ParameterizedThreadStart(firstStation.SendFramesToSecondBuf)); Thread secondThread = new Thread(new ParameterizedThreadStart(secondBuffer.SendFramesToSecondSt)); Thread thirdThread = new Thread(new ParameterizedThreadStart(secondStation.SendReceiptToFirstSt)); Thread forthThread = new Thread(new ParameterizedThreadStart(secondStation.SendFramesToFirstBuf)); Thread fifthThread = new Thread(new ParameterizedThreadStart(firstBuffer.SendFramesToFirstSt)); Thread sixthThread = new Thread(new ParameterizedThreadStart(firstStation.SendReceiptToSecondSt)); PostDataToSecondBufWt postDataToSecondBufferWt = new PostDataToSecondBufWt(secondBuffer.ReceiveFrames); PostDataFromSecondBufWt postDataFromSecondBufWt = new PostDataFromSecondBufWt(secondStation.ReceiveFrames); SecondStPostToFirstStWt postReceiptToFirstStWt = new SecondStPostToFirstStWt(firstStation.ReceiveReceipt); PostDataToFirstBufWt postDataToFirstBufferWt = new PostDataToFirstBufWt(firstBuffer.ReceiveFrames); PostDataFromFirstBufWt postDataFromFirstBufWt = new PostDataFromFirstBufWt(firstStation.ReceiveFrames); FirstStPostToSecondStWt postReceiptToSecondtStWt = new FirstStPostToSecondStWt(secondStation.ReceiveReceipt); firstThread.Start(postDataToSecondBufferWt); secondThread.Start(postDataFromSecondBufWt); thirdThread.Start(postReceiptToFirstStWt); forthThread.Start(postDataToFirstBufferWt); fifthThread.Start(postDataFromFirstBufWt); sixthThread.Start(postReceiptToSecondtStWt); Console.ReadLine(); }
public void SendReceiptToFirstSt(Object obj) { Stopwatch framesReceptionWatch = new Stopwatch(); _postReceipt = (SecondStPostToFirstStWt)obj; _sentReceipt = new BitArray(1); framesReceptionWatch.Start(); _signalFromSecondBuffer.WaitOne(); framesReceptionWatch.Stop(); TimeSpan framesReceptionTime = framesReceptionWatch.Elapsed; if (framesReceptionTime.Milliseconds > 40) { _sentReceipt[0] = false; ConsoleHelper.WriteToConsole("станция 2", "отправляю REJ-запрос"); } else { _sentReceipt[0] = true; for (int i = 0; i < _receivedFrames.Length; i++) { Random rnd = new Random(); bool dataIsValid = (rnd.Next(1, 20) % 6) != 0; if (dataIsValid == true) { ConsoleHelper.WriteToConsoleArray("станция 2 полученный кадр №" + FrameHelper.getIntFromBitArray(FrameHelper.GetBinaryFrameNumber(_receivedFrames[i])), FrameHelper.GetFrameData(_receivedFrames[i])); string fileRow = FrameHelper.BitArrayToString(FrameHelper.GetFrameData(_receivedFrames[i])); WriteDataToStFile(fileRow, true); } else { ConsoleHelper.WriteToConsole("станция 2 полученный кадр №" + FrameHelper.getIntFromBitArray(FrameHelper.GetBinaryFrameNumber(_receivedFrames[i])), "данные повреждены"); ConsoleHelper.WriteToConsole("станция 2", "отправляю REJ-запрос"); frameIsMissed = true; //clear file data WriteDataToStFile("", false); _signalToFirstSt.Release(); break; } } } _postReceipt(_sentReceipt); if (frameIsMissed == true) { _signalFromSecondBuffer.WaitOne(); for (int i = 0; i < _receivedFrames.Length; i++) { ConsoleHelper.WriteToConsoleArray("станция 2 полученный кадр №" + FrameHelper.getIntFromBitArray(FrameHelper.GetBinaryFrameNumber(_receivedFrames[i])), FrameHelper.GetFrameData(_receivedFrames[i])); string fileRow = FrameHelper.BitArrayToString(FrameHelper.GetFrameData(_receivedFrames[i])); WriteDataToStFile(fileRow, true); } } ConsoleHelper.WriteToConsole("станция 2", "отправил RR-ответ станции 1"); _signalToFirstSt.Release(); Stopwatch framesReceptionWatch2 = new Stopwatch(); _sentReceipt = new BitArray(1); framesReceptionWatch2.Start(); _signalFromSecondBuffer.WaitOne(); framesReceptionWatch2.Stop(); TimeSpan framesReceptionTime2 = framesReceptionWatch2.Elapsed; if (framesReceptionTime2.Milliseconds > 40) { _sentReceipt[0] = false; ConsoleHelper.WriteToConsole("станция 2", "Данные не получены"); } else { _sentReceipt[0] = true; for (int i = 0; i < _receivedFrames.Length; i++) { if (ValidData(_receivedFrames[i]) == true) { ConsoleHelper.WriteToConsoleArray("станция 2 полученный кадр №" + FrameHelper.getIntFromBitArray(FrameHelper.GetBinaryFrameNumber(_receivedFrames[i])), FrameHelper.GetFrameData(_receivedFrames[i])); string fileRow = FrameHelper.BitArrayToString(FrameHelper.GetFrameData(_receivedFrames[i])); WriteDataToStFile(fileRow, true); } else { ConsoleHelper.WriteToConsole("станция 2 полученный кадр №" + FrameHelper.getIntFromBitArray(FrameHelper.GetBinaryFrameNumber(_receivedFrames[i])), "данные повреждены"); } } } _postReceipt(_sentReceipt); ConsoleHelper.WriteToConsole("станция 2", "отправил RNR-ответ станции 1"); _signalToFirstSt.Release(); }