Produtor/consumidor (simples) C#

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:

private void button1_Click(object sender, EventArgs e)
{
tamanhoBuffer = Int32.Parse(textBox1.Text);

if (tamanhoBuffer>=1 && tamanhoBuffer <= 10)
{
buffer = new int[tamanhoBuffer];
button1.Enabled = false;
timer1.Enabled = true;
timer1.Start();
}
else
{
MessageBox.Show("Introduza um valor para o tamanho do Buffer entre 1 e 10");
}

}

private void timer1_Tick(object sender, EventArgs e)
{
tempo++;
label1.Text = "Tempo de Simulação: " + tempo;

var1 = aleatorio.Next(0, 99);

if (var1 <= 14)
{
"Aqui adicionar elemento ao vector";
}

}
 
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
 
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

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.
 
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 ...
 
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.

Código:
if (var1 <= 14)
{
	if(indice < tamanhoBuffer)
	{
		buffer[indice] = var1;
		indice++;
	}
	else
	{
		timer1.Stop();
		MessageBox.Show("Buffer cheio!");
	}
}
 
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.
 
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.
 
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
{
public partial class Form1 : Form
{
int[] buffer;
Random aleatorio = new Random();
int tempo = 0;
int tempo2 = 0;
int var1 = 0;
int var2 = 0;
int probproduzir = 0;
int probconsumir = 0;
int tamanhoBuffer = 0;
int indice = 0;

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
tamanhoBuffer = Int32.Parse(textBox1.Text);
probproduzir = Int32.Parse(textBox2.Text);
probconsumir = Int32.Parse(textBox3.Text);

if (tamanhoBuffer>=1 && tamanhoBuffer <= 10)
{
buffer = new int[tamanhoBuffer];

if (probproduzir >= 1 && probproduzir <= 100 && probconsumir >= 1 && probconsumir <= 100)
{
button1.Enabled = false;
timer1.Enabled = true;
timer1.Start();
timer2.Enabled = true;
timer2.Start();
}
else
{
MessageBox.Show("Introduza um valor entre 1 e 100");
}
}
else
{
MessageBox.Show("Introduza um valor para o tamanho do Buffer entre 1 e 10");
}

}

private void timer1_Tick(object sender, EventArgs e)
{
tempo++;
label1.Text = "Tempo de Simulação: " + tempo;

var1 = aleatorio.Next(0, 99);

if (var1 <= probproduzir && indice < tamanhoBuffer)
{
timer1.Start();

buffer[indice] = var1;

label2.Text += " " + buffer[indice];

indice++;
}
if (indice == tamanhoBuffer)
{
timer1.Stop();
}

}

private void timer2_Tick(object sender, EventArgs e)
{
tempo2++;
label7.Text = "Tempo de Simulação: " + tempo2;

var2 = aleatorio.Next(0, 99);

if (var2 <= probconsumir && indice > 0)
{
timer2.Start();
indice--;
}
if (indice == 0)
{
timer2.Stop();
}

}
}
}
 
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 ;)
 
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 ;)

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!
 
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.
 
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.
 
Back
Topo