public void SendPortionOfData(ref BitArray[] sentFrames, ref PostDataToFirstBufWt postFrames, int startSendingInd, int portionSize) { BitArray[] portion = new BitArray[portionSize]; Array.Copy(sentFrames, startSendingInd, portion, 0, portionSize); postFrames(portion); }
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 SendFramesToFirstBuf(object obj) { _connectionSem.WaitOne(); wantsToConnect = true; if (FirstStation.wantsToConnect == true) { ConsoleHelper.WriteToConsole("станция 2", "согласен на соединение"); } else { ConsoleHelper.WriteToConsole("станция 2", "запрашиваю соединение"); } _connectionSem.Release(); _transmissionSem.WaitOne(); SplitDataOnFragments(); _postFrames = (PostDataToFirstBufWt)obj; SendPortionOfData(ref _sentFrames, ref _postFrames, 0, windowSize); ConsoleHelper.WriteToConsole("станция 2", "отправил кадры буферу 1"); _signalToFirstBuffer.Release(); _signalFromFirstSt.WaitOne(); ConsoleHelper.WriteToConsoleArray("станция 2 полученный RR-ответ", _receivedReceipt); SendPortionOfData(ref _sentFrames, ref _postFrames, windowSize, windowSize); ConsoleHelper.WriteToConsole("станция 2", "отправил кадры буферу 1"); _signalToFirstBuffer.Release(); _signalFromFirstSt.WaitOne(); ConsoleHelper.WriteToConsoleArray("станция 2 полученный RNR-ответ", _receivedReceipt); _transmissionSem.Release(); _disConnectionSem.WaitOne(); wantsToDisconnect = true; if (FirstStation.wantsToDisconnect == true) { ConsoleHelper.WriteToConsole("станция 2", "согласен на разъединение"); } else { ConsoleHelper.WriteToConsole("станция 2", "запрашиваю разъединение"); } _disConnectionSem.Release(); }