private void Form2_Load(object sender, EventArgs e) { interpretacao = (object obj) => { //bool flagFim = false; semaforoDesenhaveis.WaitOne(); //inicializarTimer(5); //MessageBox.Show("Interpretando"); if (!DesenhavelRepositorio.estaVazio()) { try { Invalidate(); g = CreateGraphics(); //resetar os gráficos } catch { } Desenhavel desenhavel = DesenhavelRepositorio.obter(); if (desenhavel != null) { interpretarDesenhavel(desenhavel); } caneta = new Pen(Color.Gray, 5); float[] padrao = { 3, 6 }; caneta.DashPattern = padrao; g.DrawLine(caneta, 0, this.Height / 2, this.Width, this.Height / 2); while (!DesenhavelRepositorio.Primeiro) //significa que esse é o primeiro desenhável { desenhavel = DesenhavelRepositorio.obter(); if (desenhavel != null) { interpretarDesenhavel(desenhavel); } } //DesenhavelRepositorio.limpar(); } semaforoDesenhaveis.Release(); //semaforoDesenhaveis.Release(); receberDesenhaveis = new Task(recebimento, "receberDesenhaveis"); //inicializarTimer(4); receberDesenhaveis.Start(); }; recebimento = (object obj) => { bool estaEscutando = false; //bool flagFim = false; semaforoDesenhaveis.WaitOne(); //inicializarTimer(4);*/ //MessageBox.Show("Escutando"); DesenhavelRepositorio.limpar(); if (!ControladorDesenhavel.Interpretando) { ConexaoP2P.tratarDados(); estaEscutando = true; } //esse método já recebe e adiciona na //classe DesenhavelRepositorio semaforoDesenhaveis.Release(); interpretarDesenhaveis = new Task(interpretacao, "interpretarDesenhaveis"); //inicializarTimer(5); interpretarDesenhaveis.Start(); //semaforoDesenhaveis.Release(); }; Action <object> controleSemaforo = (object obj) => { administrarSemaforo(); }; semaforoDesenhaveis = new Semaphore(0, 1); controlarSemaforo = new Task(controleSemaforo, "controlarSemaforo"); // receberDesenhaveis.Start(); flagFimInterpretacao = true; //receberDesenhaveis.Start(); semaforoDesenhaveis.Release(); controlarSemaforo.Start(); //finalizarTimer(true); }
public static void interpretarBuffer(byte[] buf) { ControladorDesenhavel.interpretando = true; // enfileirar dados /* byte[] buffer = new byte[buf.Length]; * for (int i = 0; i < buf.Length; i++) * buffer[i] = buf[i]; *///MessageBox.Show("Tratando dados"); //pegar conjuntos de 41 em 41 bytes //repDes = new DesenhavelRepositorio(); //throw new Exception("a"); //MessageBox.Show("Recebeu TCP"); for (int i = 0; i == 0 || i < buf.Length - 40; i = i + 41) { if (buf[i] == flagFim) { //flag para FIM = 255 Form2.flagFimSimulacao = true; ControladorDesenhavel.interpretando = false; return; } if (buf[i] == flagInicio) { frmPrincipal.flagAbrirSimulacao = true; ControladorDesenhavel.interpretando = false; return; } byte[] convertidoIndice = inverter(buf, i + 1, i + 5); byte[] convertidoQTD = inverter(buf, i + 5, i + 9); byte[] convertidoXRel = inverter(buf, i + 9, i + 17); byte[] convertidoYRel = inverter(buf, i + 17, i + 25); byte[] convertidoLarguraRel = inverter(buf, i + 25, i + 33); byte[] convertidoAlturaRel = inverter(buf, i + 33, i + 41); Desenhavel itemBuffer = null; //byte 0-> indica se é forma, imagem, fim, início, ... int indice = BitConverter.ToInt32(convertidoIndice, 0); //byte 1 até 4 => índice int qtdDesenhaveis = BitConverter.ToInt32(convertidoQTD, 0); //byte 5 até 8 => qtd Desenhaveis desse tipo double xRel = BitConverter.ToDouble(convertidoXRel, 0); //byte 9 até 16 => xRel double yRel = BitConverter.ToDouble(convertidoYRel, 0); //byte 17 até 24 => yRel double larguraRel = BitConverter.ToDouble(convertidoLarguraRel, 0); //byte 25 até 32 => larguraRel double alturaRel = (double)BitConverter.ToDouble(convertidoAlturaRel, 0); //byte 33 até 40 => alturaRel if (buf[i] != flagFim && buf[i] != flagForma) { //flag para imagem itemBuffer = new Imagem(indice, xRel, yRel, larguraRel, alturaRel); } if (buf[i] == flagForma) { //flag para forma = 254 itemBuffer = new Forma(indice, xRel, yRel, larguraRel, alturaRel); } DesenhavelRepositorio.armazenar(itemBuffer, qtdDesenhaveis); DesenhavelRepositorio.armazenar(itemBuffer); } Form2.flagFimInterpretacao = false; Form2.flagFimRecebimento = true; ControladorDesenhavel.interpretando = false; }