1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Produtor/consumidor (simples) C#

Discussão em 'Programação' iniciada por toninho_77, 25 de Abril de 2009. (Respostas: 14; Visualizações: 2659)

  1. toninho_77

    toninho_77 Power Member

    Boas, gostaria de pedir uma ajudinha, estou a elaborar uma aplicação em c#, que retrate o problema do produtor/consumidor, mas este muito simples sem threads. Então é o seguinte, a ideia é definir pelo utilizador o tamanho de um vector, depois consoante o timer vai avançado aleatoriamente vai sendo adicionado a esse vector elementos, quando o vector encher deverá mandar uma sms a dizer vector cheio, e parar de mandar elementos lá para dentro.
    Eu já tentei chegar lá, mas ainda não consegui, por isso se me puderem ajudar agradecia.
    Cumps.

    exemplo do que já tentei:

     
  2. ceptrus

    ceptrus Power Member

    nao percebi mt bem o k kerias.. mas deve ser algo deste género


    precisas de ter uma variavel global para saberes em k indice do array estás a inserir e outra para saber qual o tamanho do array, depois dentro da tua funçao timer1_Tick onde tens o comentário é meter

    Código:
    if(indice < buffer.length)
       buffer[indice++] = var1;
    o indice++ vai permitir inserires na posiçao 0 do array, logo de seguida incrementa para 1, etc..

    espero k isto resolva, ou ande perto do k pretendes
     
  3. toninho_77

    toninho_77 Power Member

    Boa noite,
    vou tentar explicar um pouco melhor a duvida porque tb não percebi mto bem a parte do indice que me explicou acima.
    Então é assim:

    Existe um vector de tamanho já definido (ou o utilizador define por textbox), depois dentro do timer é criado um nº aleatório, se esse numero aleatório for menor que 14 é adicionado ao vector 1 elemento, caso não seja, não adiciona nada ao vector.
    O problema que estou a ter é que é smp adicionado ao vector a cada "segundo" do timer:confused:
    Espero que tenha percebido melhor a ideia, eu penso a implementação ser facil mas estou a entrar em parefuso:(
    Cumprimentos.
     
  4. iznougud

    iznougud I quit My Job for Folding

    Mostra aqui a tua inicialização do "aleatorio".
     
  5. toninho_77

    toninho_77 Power Member

    Aqui está!

     
  6. iznougud

    iznougud I quit My Job for Folding

    Testei o teu código e tudo funcionou bem, defini o buffer de tamanho 10 e só ao fim de 84 ticks é que enchi o buffer. Nao percebo como é que aí ele insere sempre o valor no buffer e nao so quando var1 <= 14 ...
     
  7. toninho_77

    toninho_77 Power Member

    Qual a função que eu posso utilizar para quando o buffer estiver cheio ele dar uma mensagem box e parar de adicionar ao buffer?
    Cumps.
     
  8. iznougud

    iznougud I quit My Job for Folding

    Código:
    if (var1 <= 14)
    {
    	if(indice < tamanhoBuffer)
    	{
    		buffer[indice] = var1;
    		indice++;
    	}
    	else
    	{
    		timer1.Stop();
    		MessageBox.Show("Buffer cheio!");
    	}
    }
    
     
  9. toninho_77

    toninho_77 Power Member

    Tenho aqui uma duvida, mas isto prende-se com a falta de conhecimento, é o seguinte se eu no fim desse codigo meter uma label do genero label2.Text += " " + buffer[indice]; a cada ticket do timer ele coloca um 0 no label, tirando o quando se verifica a condição que adiciona o numero, sabe-me dizer a razão do sucedido? Pensei que não colocaria lá nada só no caso da condição se verificar.
    Cumprimentos.
     
  10. iznougud

    iznougud I quit My Job for Folding

    Código:
    if (var1 <= 14)
    {
    	if(indice < tamanhoBuffer)
    	{
    		buffer[indice] = var1;
    		
    		label2.Text += " " + buffer[indice];
    			
    		indice++;
    	}
    	else
    	{
    		timer1.Stop();
    		MessageBox.Show("Buffer cheio!");
    	}
    }
    Deve ser isto que queres. Se o pusesses depois do "indice++" ias obter o valor que esta na proxima slot a usar, ou seja 0.
     
  11. toninho_77

    toninho_77 Power Member

    Boas, graças ás ajudas penso que a parte de adicionar elementos ao vector tá a funcionar ás 1000 maravilhas!:001:
    Agora estava a tentar noutro timer (timer2), fazer o processo inverso, ou seja, ir retirando um elemento do buffer, caso se verifique uma condição, mas penso que não está a funcionar, se me puder indicar onde anda o erro agradecia.
    Cumps.

    código:
    namespace Produtor_consumidor
     
  12. iznougud

    iznougud I quit My Job for Folding

    O que te deve estar a acontecer é que o Timer 2 esta a disparar antes de algo ser introduzido no buffer, logo vai parar o Timer2. Quando introduzes algo no buffer tens de arrancar o Timer2 (idealmente deverias verificar se ele ja estava a correr e caso nao estivesse fazias start)

    Código:
    if (var2 <= probconsumir && indice > 0)
    {
    timer2.Start();
    indice--;
    }
    Isto é muito bonito mas a partir do momento em que fazes Stop ao Timer2 nunca mais o consegues arrancar ;)
     
  13. toninho_77

    toninho_77 Power Member

    Pois realmente reparei nisso, provávelmente o timer não o vou pôr a parar, porque realmente ele n volta de novo ao activo!
     
  14. iznougud

    iznougud I quit My Job for Folding

    Tenta com:

    Código:
    private void timer2_Tick(object sender, EventArgs e)
    {
    	tempo2++;
    	label7.Text = "Tempo de Simulação: " + tempo2;
    
    	if (indice > 0)
    	{
    		var2 = aleatorio.Next(0, 99);
    
    		if (var2 <= probconsumir)
    		{
    			indice--;
    		}
    	}
    }
    
    Isto deve fazer o que queres sem estares a gerar o nº aleatorio sem necessidade.
     
  15. toninho_77

    toninho_77 Power Member

    Muito obrigado pelas ajudas:003:
    Trabalho foi concluído e penso que até vou ter uma notinha mais ou menos!
    Se quiserem meto aí o resultado final!
    Cumps.
     

Partilhar esta Página