Esempio n. 1
0
        // по получении ответа
        private void OnReadFromNetworkStream(IAsyncResult result)
        {
            PeerBaseContainer peer = result.AsyncState as PeerBaseContainer;
            int msgLength          = BitConverter.ToInt32(peer.Buffer, 0);

            peer.Client.GetStream().Read(peer.Buffer, 0, msgLength);
            //читаем обработанное сообщение
            ImageProcessingMessage msg = new ImageProcessingMessage(peer.Buffer, msgLength);

            //присваиваем значения в соответствии с workID и смещением
            for (int i = 0; i < msg.ImageArray.Length; i++)
            {
                ArrayTempBuffer[i + (msg.WorkID * Offset)] = msg.ImageArray[i];
            }
            //декремент переменной оставшихся частей
            if (onDecrement.WaitOne())
            {
                PartsRemained--;
                //если это последняя часть
                if (PartsRemained == 0)
                {
                    //вызываем делегат
                    onImageProcessed(ArrayTempBuffer);
                }
                onDecrement.ReleaseMutex();
            }
            //завершаем чтение
            peer.Client.GetStream().EndRead(result);
        }
Esempio n. 2
0
 //обработать картинку
 public void ProcessImage(Bitmap image, int filterID, OnImageProcessed onImageProcessed)
 {
     this.onImageProcessed = onImageProcessed;
     if (Workers.Count == 0)
     {
         MessageBox.Show("App must contains at least 1 peer", "Error");
     }
     else
     {
         //высчитываем смещение, сколько частей будем ждать и тд
         int[] imageArray = GetImageArray(image);
         ArrayTempBuffer = imageArray;
         int workerOffset = imageArray.Length / Workers.Count;
         PartsRemained = Workers.Count;
         Offset        = workerOffset;
         int counter = 0;
         // для каждого пира
         foreach (PeerBaseContainer peer in Workers)
         {
             //создаём сообщение
             ImageProcessingMessage message = new ImageProcessingMessage(counter++, filterID, image.Height, image.Width, workerOffset, imageArray);
             //асинхронно отправляем его
             Task.Factory.StartNew(() => peer.SendMessage(message));
             //асинхронно ожидаем ответа
             peer.Client.GetStream().BeginRead(peer.Buffer, 0, 4, OnReadFromNetworkStream, peer);
         }
     }
 }
Esempio n. 3
0
        static void Main(string[] args)
        {
            ImagePeerService peerService = new ImagePeerService();

            while (!peerService.IsConnected)
            {
                peerService.TryToConnect(EndPoint);
                Console.WriteLine($"Appointed GUID: {peerService.Guid}");
            }

            while (true)
            {
                ImageProcessingMessage    message = peerService.WaitForMessage();
                ZeroNeighborsSharedFilter filter  = ZeroNeighborsSharedFilter.GetFilterByID(message.FilterID);
                for (int i = 0; i < message.ImageArray.Length; i++)
                {
                    message.ImageArray[i] = filter.Filter(message.ImageArray[i]);
                }
                peerService.SendMessage(message);
            }
        }