Exemple #1
0
        public uint Read(out byte[] data)
        {
            if (!mailslot.IsValid())
            {
                throw new Exception("Mailslot handle is invalid.");
            }

            uint bytesRead = 0;

            try
            {
                var info = mailslot.GetMailslotInfo();
                if (info.MessageCount == 0)
                {
                    data = new byte[] { };
                    return(0);
                }
                data = new byte[info.NextMessageSize];
                WinFunctions.ReadFile(mailslot.Handle, data, (uint)data.Length, out bytesRead, IntPtr.Zero);
            }
            catch (Exception ex)
            {
                if (!IsRunning)
                {
                    data = new byte[] {};
                    return(bytesRead);
                }
                data = new byte[] { };
                WinFunctions.ThrowException("Read failed.", ex);
            }
            return(bytesRead);
        }
        private void ReceiveCards()
        {
            int clientMailslotHandle;   // дескриптор мэйлслота

            clientMailslotHandle = Mailslot.CreateMailslot("\\\\.\\mailslot\\ReceiveCardsMailslot", 0, Types.MAILSLOT_WAIT_FOREVER, 0);
            Card card            = new Card(); // прочитанное сообщение
            Card prevCard        = new Card(); // для проверки в случае, когда отправляется одно и то же сообщение несколько раз
            int  mailslotSize    = 0;          // максимальный размер сообщения
            int  nextMessageSize = 0;          // размер следующего сообщения
            int  messageCount    = 0;          // количество сообщений в мэйлслоте
            uint realBytesReaded = 0;          // количество реально прочитанных из мэйлслота байтов

            while (work)
            {
                Mailslot.GetMailslotInfo(clientMailslotHandle, mailslotSize, ref nextMessageSize, ref messageCount, 0);
                if (messageCount > 0)
                {
                    for (int i = 0; i < messageCount; i++)
                    {
                        byte[] bytes = new byte[400];
                        // "Принудительная" запись данных, расположенные в буфере операционной системы, в файл мэйлслота
                        Mailslot.FlushFileBuffers(clientMailslotHandle);
                        Mailslot.ReadFile(clientMailslotHandle, bytes, 400, ref realBytesReaded, 0);
                        BinaryFormatter formatter = new BinaryFormatter();
                        using (MemoryStream memory = new MemoryStream(bytes))
                        {
                            card = (Card)formatter.Deserialize(memory);
                            // Если пришла карта с CardSuit.Count, CardQuality.Count (признак окончания раздачи) очищаем столл
                            if (card.Equals(new Card(CardSuit.Count, CardQuality.Count)))
                            {
                                CleanTable();
                                continue;
                            }

                            if (!card.Equals(prevCard))
                            {
                                prevCard = card;
                            }
                            else
                            {
                                continue;
                            }
                        }

                        Invoke(new MethodInvoker(() =>
                        {
                            // Выдаем карты на flop'е
                            if (pbFlop1.Image == null)
                            {
                                pbFlop1.Image = Image.FromFile("../../Images/Cards/" + card.suit.ToString() + card.quality.ToString() + ".png");
                                return;
                            }
                            if (pbFlop2.Image == null)
                            {
                                pbFlop2.Image = Image.FromFile("../../Images/Cards/" + card.suit.ToString() + card.quality.ToString() + ".png");
                                return;
                            }
                            if (pbFlop3.Image == null)
                            {
                                pbFlop3.Image = Image.FromFile("../../Images/Cards/" + card.suit.ToString() + card.quality.ToString() + ".png");
                                return;
                            }
                            // Выдаем карты на turn'е
                            if (pbTurn.Image == null)
                            {
                                pbTurn.Image = Image.FromFile("../../Images/Cards/" + card.suit.ToString() + card.quality.ToString() + ".png");
                                return;
                            }
                            // Выдаем карты на river'е
                            if (pbRiver.Image == null)
                            {
                                pbRiver.Image = Image.FromFile("../../Images/Cards/" + card.suit.ToString() + card.quality.ToString() + ".png");
                                return;
                            }
                        }));

                        Thread.Sleep(500);
                    }
                }
            }
        }