• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

zephirus

Prever tempo de conclusão de ciclo while

33 mensagens neste tópico

Esta é mais complicada...

Tenho um ciclo while que varia entre 1 e X onde X tanto pode ser pequeno como uns bons milhares.

Esse ciclo while é iniciado com o pressionar de um botão. Quando o botão é pressionado eu consigo saber o instante (em tempo) em que ele foi pressionado. O que eu pretendo é, durante a execução do ciclo, saber de antemão em que altura (hh:mm:ss), o ciclo termina. Não sei se haverá outra maneira mas o que eu pensei fazer foi:

1. Sei o instante em que carreguei no botão (tempoinicial);

2. Dentro do ciclo while coloco um IF do tipo:

If (tempoactual - tempoinicial) = 1 Then
   pos = actualX (o actualX é o número da iteração actual do ciclo while)
End If

Sabendo 'pos', posso calcular o tempo final através de:

tempofinal = X / pos

Assim teria uma hora aproximada em que o ciclo termina.

Alguma sugestão para implementar isto?

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

podes por o tamanho maximo do while numa progress bar...

assim sabes quando estara proximo do fim

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

podes por o tamanho maximo do while numa progress bar...

assim sabes quando estara proximo do fim

Isso eu já tenho e é uma indicação para o utilizador mas o que eu queria mesmo era a hora final...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o que tu tas a dizer é um pouco irreal...porque o computador n é certo... depende do processador ram e do que tens abert ... n há maneira de teres uma estimativa correcta ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Penso que será possivel..."tudo é possivel"...

não sei se haverá maneira de converter o maximo do while para "Date" (minutos e segundos)...e depois fazer uma especie de relogio decrescente..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

epa ... isso são estimativas do acaso visto que o computador é dinamico... hmmmm

basicamente o computador é como os correios tu vais la levantar uma cena e ves 50 pessoas ...agora podes ter sorte e demorar só meia hora porque as 50 pessoas foram comprar um selo, ou podes demorar umas horas porque elas foram todas levantar coisas pagar as contas falar ca senhora dos correios.... percebes onde quero chegar ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

nao percebo...podias abrir outro tópico para falar sobre isso..

O computador faz o que tu quiseres..tens que lhe explicar bem, o que pretendes...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

pronto ...epa n sei se voces nao percebem o k eu digo ou nao querem perceber....

epa ja agora pergunta la ao computador se ele tem ideias ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

nao percebo...podias abrir outro tópico para falar sobre isso..

O computador faz o que tu quiseres..tens que lhe explicar bem, o que pretendes...

"O computador faz o que tu quiseres" -->nao disse que tinha ideias

segue o meu consellho, abre outro tópico...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

nao abro quero... deixa quero ver como isto se desenlaça

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

podemos discutir o que quiseres, é importante para a sociedade...

mas neste tópico ajudamos o zephirus a prever o tempo de conclusão de ciclo while...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desde já obrigado pelo interessse na discussão deste problema.

1. Obviamente que o tempo de conclusão do ciclo é uma estimativa, eu sei disso. Mas é diferente um ciclo de 10 iterações para um de 20000 considerando que cada iteração já demora uns milisegundos.

2. O que eu pretendo é uma ESTIMATIVA apenas mas por outro lado, essa estimativa também pode ser calculada em tempo real durante o ciclo, isto é, conforme o ciclo se vai desenrolando, uma nova previsão é feita.

3. Quanto ao ser irreal, não concordo. Centenas de programas que envolvem cálculos demorados dão uma estimativa de conclusão do processo. Um bom exemplo é a codificação de um vídeo por exemplo.

Foi sugerido que usasse uma progressbar. Essa ideia é óptima para o utilizador não ficar a olhar para uma janela estática sem saber se o programa está a fazer os cálculos ou não. Isso eu já fiz e se isto que pretendo for complicado, a progressbar terá de servir. Mas mesmo assim gostava de tentar.

Aceitam-se sugestões.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok ve quanto tempo demora a iteraçao  e adicionas esse variavel a uma variavel fora do scope do ciclo,

divides pelo numero que vai e multiplicas pelo total das iteraçoes ....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok ve quanto tempo demora a iteraçao  e adicionas esse variavel a uma variavel fora do scope do ciclo,

divides pelo numero que vai e multiplicas pelo total das iteraçoes ....

Mas eu tenho de mostrar o tempo previsto de finalização do ciclo durante o ciclo e não no final. Ou seja, quando dizes "ve quanto tempo demora a iteraçao" tenho de fazer isso numa amostra do ciclo total entendes? Eu tenho a teoria toda mas na prática não funciona...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

n, no final da iteração

vou escrever em pseudo codigo que n curto muito o vb :)

var totalMs;
var tempo=datetime.now();
for( i=0 ;i<9999 ;i++)
{
o teu codigo ....

var tempoAntigo = tempo;
tempo=datetime.now();
totalMs= timespan(tempoAntigo,tempo)
escreveLinha((totalMs/i)*9999);
}

e ele mostra o tempo em ticks .. tens de converter mas acho que a ideia ta lá

percebes-te agora ?:D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não sei nada de vb.net, mas tudo o que disseste está correcto... Existirá com certeza uma função que te devolve um tempo qualquer (tempo de execução do programa, milisegundos desde 1970, qualquer coisa), tens que definir uma variável (time_start por exemplo) antes de entrar no ciclo com esse tempo, depois a cada iteração, ou dez iterações, como te apetecer, defines uma variável como sendo a função de tempo neste instante - time_start. Divides essa variável pelo número da iteração actual, e multiplicas o resultado pelo número máximo de iterações menos o número da iteração actual. E tens o número de milisegundos (ou a unidade de tempo que for dada pela função de tempo) que faltam até concluíres o processo. A forma como apresentas essa informação é à tua escolha. Podes fazer um print no ecrã a dizer "Faltam " x/1000 "segundos para terminar".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrigado mas ele tem que fazer a media do que passou e multiplicar por todas as iteraçoes hmmm espera queres saber quanto tempo falta é ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrigado mas ele tem que fazer a media do que passou e multiplicar por todas as iteraçoes hmmm espera queres saber quanto tempo falta é ?

Yep

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

escreveLinha((9999-i)*(totalMs/i));

é isso que queres entao mas percebeste isto ou nao ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para já tenho um problema que é fazer operações com datas. Como é que faço somas e diferenças de datas em VB.NET?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

timespan procura por isso

Já consegui. Só me falta uma coisa. Passar ticks para data.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pronto, já resolvi o problema. Fiz um pequeno programa que demonstra aquilo que pretendia. Agora é só aplicar isto no projecto que estou a desenvolver.

O programa não é muito preciso mas podem experimentar por vocês e ver que serve bem de aproximação. Ainda há uns detalhes em que posso mexer para o melhorar.

Obrigado a todos pela ajuda.

Aqui fica o código e o programa.

http://rapidshare.de/files/38962964/previsaotempo.rar.html

Public Partial Class MainForm
Public Sub New()
	' The Me.InitializeComponent call is required for Windows Forms designer support.
	Me.InitializeComponent()

	'
	' TODO : Add constructor code after InitializeComponents
	'
End Sub

Sub Button1Click(sender As Object, e As EventArgs)

	label2.Text = ""
	label3.Text = ""
	label5.Text = ""

	Dim c As Integer = 0

	Dim tempoinicial As DateTime = Now
	label2.Text = tempoinicial

	While c >= 0 And c < 100
		label14.Text = Now
		progressbar1.Value = c
		label1.Text = progressbar1.Value
		System.Threading.Thread.Sleep(textBox1.Text)
		c = c + 1
		Application.DoEvents
	End While

	If c = 100 Then

		label14.Text = Now

		Dim tempoparcial As DateTime = Now

		Dim duracaoparcial As TimeSpan
		duracaoparcial = tempoparcial.Subtract(tempoinicial)

		Dim tempoatefinal As double
		tempoatefinal = (duracaoparcial.TotalMilliseconds * 9.4) + 1000
		label14.Text = tempoatefinal

		Dim tempofinalprevisto As DateTime
		tempofinalprevisto = tempoinicial.AddMilliseconds(tempoatefinal)
		label5.Text = tempofinalprevisto

		progressbar1.Value = c
		label1.Text = progressbar1.Value
		System.Threading.Thread.Sleep(textBox1.Text)
		c = c + 1
		Application.DoEvents
	End If

	While c >= 101 And c < 1001

		label14.Text = Now

		progressbar1.Value = c
		label1.Text = progressbar1.Value
		System.Threading.Thread.Sleep(textBox1.Text)
		c = c + 1
		Application.DoEvents
	End While

	Dim tempofinal as Date = Now
	label3.Text = tempofinal

End Sub
End Class

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

de certesa que era isso que querias fazer ? é que tas a fazer um sleep ou seja é como se parasses a execuçao do programa ... acho eu

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

de certesa que era isso que querias fazer ? é que tas a fazer um sleep ou seja é como se parasses a execuçao do programa ... acho eu

O sleep é só para isso demorar mais tempo. Isso não é o meu programa, é apenas para mostrar o que pretendo. No meu programa, em vez do sleep tenho o meu código onde são feitos diversos cálculos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora