Exemplo programação concorrente.

Programação C em geral

Moderadores: 51, guest2003

Exemplo programação concorrente.

Mensagempor Red Neck Guy » 24 Nov 2012 10:48

Código: Selecionar todos
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Collections.Concurrent;

namespace Testando_semáforos
{
    public delegate void addString(int indice,String texto);

    public enum Comandos
    {
        Assumir_thread
    }

    public struct MessageS
    {
        public Comandos comando;
        public int parametro;
    }

    public partial class Form1 : Form
    {
        private ConcurrentQueue<MessageS> fila_mensagens = new ConcurrentQueue<MessageS>();
        private Semaphore semaphoro = new Semaphore(1, 1);

        public Form1()
        {
            InitializeComponent();
        }

        private void addStringAux(int indice, String texto)
        {
            switch (indice)
            {
                case 0: lv_thread_01.Items.Add(texto);
                    break;
                case 1: lv_thread_02.Items.Add(texto);
                    break;
            }
        }

        public void addStringIntoLists(int indice, String texto)
        {
            if (InvokeRequired)
            {
                addString dlg = new addString(addStringAux);
                Invoke(dlg, new Object[] { indice, texto });
            }
            else
                addStringAux(indice, texto);
        }


        private void monitor_thread()
        {
            try
            {
                bloco_execucao();
            }
            catch (ThreadAbortException)
            {               
                addStringIntoLists(0, "Abortado");
                addStringIntoLists(1, "Abortado");
            }
            catch (ThreadInterruptedException)
            {


            }
        }

        private void bloco_execucao()
        {
            int indice = 0;
            MessageS msg;

            for (; ; )
            {

                if (fila_mensagens.TryDequeue(out msg))
                {
                    indice = msg.parametro;
                }

                semaphoro.WaitOne();

                addStringIntoLists(indice, "Agora sou eu " + DateTime.Now.ToString());

                semaphoro.Release();

                Thread.Sleep(1000);
            }
        }

        private Thread monitor;

        private void Iniciar_Click(object sender, EventArgs e)
        {
            lv_thread_01.Items.Clear();
            lv_thread_02.Items.Clear();

            monitor = new Thread(new ThreadStart(monitor_thread));
            monitor.Priority = ThreadPriority.Lowest;
            monitor.Start();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageS msg;
            msg.comando = Comandos.Assumir_thread;
            msg.parametro = 0;
            fila_mensagens.Enqueue(msg);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            MessageS msg;
            msg.comando = Comandos.Assumir_thread;
            msg.parametro = 1;
            fila_mensagens.Enqueue(msg);
        }

        private void Parar_Click(object sender, EventArgs e)
        {
            if (monitor != null)
                monitor.Abort();           
        }

        private Thread monitor_secundario;

        private void Fecha_Click(object sender, EventArgs e)
        {
            monitor_secundario = new Thread(new ThreadStart(monitor_semaforo));
            monitor_secundario.Start();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            monitor_secundario.Abort();
        }

        private void monitor_semaforo()
        {           
            try
            {
                semaphoro.WaitOne();
                for (; ; )
                {
                    addStringIntoLists(0, DateTime.Now.ToString() + " Eu estou no controle");
                    addStringIntoLists(1, DateTime.Now.ToString() + " Eu estou no controle");
                    Thread.Sleep(1000);
                }
            }
            catch (ThreadAbortException)
            {

            }
            finally
            {
                if(semaphoro!=null)
                  semaphoro.Release();
            }
        }

        private void direto()
        {
            int indice = 0;
            MessageS msg;

            try
            {
                for (; ; )
                {
                    semaphoro.WaitOne();

                    addStringIntoLists(indice, "-> Thread direta " + DateTime.Now.ToString());

                    indice++;
                    if (indice > 1)
                        indice = 0;
                    msg.comando = Comandos.Assumir_thread;
                    msg.parametro = indice;
                    fila_mensagens.Enqueue(msg);


                    semaphoro.Release();

                    Thread.Sleep(1000);
                }
            }
            catch (ThreadAbortException)
            {
               

            }
            finally
            {
                try
                {
                    semaphoro.Release();
                }
                catch (Exception)
                {

                }
            }
        }

        private Thread monitor_direto;

        private void button3_Click(object sender, EventArgs e)
        {
            monitor_direto = new Thread(new ThreadStart(direto));
            monitor_direto.Start();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            if (monitor_direto != null)
                monitor_direto.Abort();
        }

       
    }
}


Alguns conceitos empregados acima:
Sincronização de acesso a recursos compartilhados com semáforos.
Envio de mensagem entre threads.
Criação e destruição de threads.


Obs.:
Para aqueles que não estão habituados com conceitos de sistemas operacionais, o método Thread.delay(X) não deixa o sistema em busywait. Ao invés disso, ele deixa a thread fora do scheduler do sistema operacional por um tempo mínimo do parametro X. (Em sistemas de tempo real esse tempo é exatamente X).
[/list]
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Mensagempor KrafT » 05 Dez 2012 20:35

Eu não consegui me entender com delegate para receber dados da serial e após um timeout, me avisar para tratar os dados.

Não lembro exatamente do problema (acabei fazendo com o bom e velho Delphi), mas não dei jeito.

Acho que por ter crescido programando com Clipper Summer 87, essas modernidades como C#, Java, etc... apresentam uma alta impedância ao aprendizado.

Mara mim, esse teu código é mandarim em braile... Sou incapaz de avaliá-lo. Talvez se fosse baseado em BTFSS e BTFSC, eu poderia obter algum proveito.
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Mensagempor msamsoniuk » 05 Dez 2012 22:46

codigo metade em portugues, metade em ingles e a blasfemia suprema: acentuacao no codigo! em que mundo estamos :/

Imagem
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor chrdcv » 05 Dez 2012 23:41

Carambolas! O Sam* voltou!

:wink: :wink: :wink:

Putz! Estava afim de dividir algumas dúvidas do iMX28 com alguém...
Seu Madruga: "O trabalho não é ruim, ruim é ter que trabalhar"
Avatar do usuário
chrdcv
Dword
 
Mensagens: 1580
Registrado em: 13 Out 2006 14:13

Mensagempor RobL » 12 Jan 2013 09:29

Não tinha visto isto aqui.
Mais uma excelente contribuição do Aquino.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor Red Neck Guy » 12 Jan 2013 10:36

Ei, tendo em vista o teu alto indice de conhecimento essas críticas soam como chute na cara. Desmotivam postar algo aqui e me levam a crer que eu deveria ter ficado trabalhando na padaria com a minha família ao invés de ter buscado essa profissão.
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Mensagempor andre_luis » 12 Jan 2013 13:37

Realmente, há maneiras muito mais sutis de se fazer algum comentário.
É lamentável perceber que frequentemente quem apresenta contribuições á comunidade, acaba sendo exposto ao ridículo.

O foco aqui não é apresentar a cartilha de recomendações das práticas de programação, mas o conceito da programação concorrente.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor msamsoniuk » 12 Jan 2013 20:59

Aquino escreveu:Ei, tendo em vista o teu alto indice de conhecimento essas críticas soam como chute na cara. Desmotivam postar algo aqui e me levam a crer que eu deveria ter ficado trabalhando na padaria com a minha família ao invés de ter buscado essa profissão.


nao exagere... as pessoas pararam de ler e levar a serio o q eu escrevo faz decadas! +_+
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04


Voltar para Visual C++/C/C++/C#

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x