Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Windows Dragon

Problemas ao criar um "Stopwatch"

Mensagens Recomendadas

Windows Dragon

Boas pessoal.

O meu problema é o seguinte, eu estou a criar uma app para android usando o monodroid que permite usar o C# para programar para android, e nessa app tenho uma app que usa um cronometro e tenho o seguinte código

using System;
using System.Timers;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using System.Diagnostics;
namespace ReceCounter
{
[Activity(Label = "ReceCounter", MainLauncher = true, Icon = "@drawable/icon")]
public class Activity1 : Activity
{
	int count = 1;
	private Timer chrono;
	private Boolean running = false;
	TextView chrono_txt;
	private Stopwatch sw;
	protected override void OnCreate(Bundle bundle)
	{
		base.OnCreate(bundle);
		SetContentView(Resource.Layout.Main);
		chrono = new Timer();
		chrono.Interval = 1;
		this.chrono.Elapsed += new ElapsedEventHandler(chrono_Tick);
		chrono_txt = FindViewById<TextView>(Resource.Id.chronoview);
		chrono_txt.Click += delegate { if(running == false)
										{
											chrono.Start();
											running = true;
											sw = new Stopwatch();
											sw.Start();
										}
										else if(running == true)
										{
											chrono.Stop();
											running = false;
											sw.Stop();
										}
									 };
	}

	void chrono_Tick(object source, ElapsedEventArgs e)
	{
		RunOnUiThread(delegate
		{
			int h = sw.Elapsed.Hours, m = sw.Elapsed.Minutes, s = sw.Elapsed.Seconds, ms = sw.Elapsed.Milliseconds;
			chrono_txt.Text = String.Format("{0:00}:{1:00}:{2:00}.{3:000}", h,m,s,ms);

		});  
	}
}
}

Mas testei só isto no Galaxy S3 e passado 2/3 segundos começa a lagar... alguma ideia?

Penso que será algum problema de optimização de código...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
kalin

Podes clarificar melhor o que queres dizer com isto?

...

e passado 2/3 segundos começa a lagar...

A única optimização que eu faria seria a criação do StopWatch, onde tens:

sw = new Stopwatch();
sw.Start();

eu substituia por:

sw.Restart();

com o StopWatch inicializado no OnCreate.

Isto é uma pequena optimização que não deverá trazer grandes alterações de performance.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Windows Dragon

Podes clarificar melhor o que queres dizer com isto?

Quero dizer que os números não aparecem fluidamente como nos cronómetros que se vêm na app store... mas sim saltiados +/- de 150 a 500ms

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
miattorocha

Já resolveu seu problema?

Se não, tive duas idéias a qual você pode investigar:

No trecho do delegate do chrono_txt.Click se running é um boolean e você tem o if(running == false) você não precisa de um else IF só o ELSE resolve. (otimização).

RunOnUiThread tenta ver os valores separadamente antes de juntar no String.Format para ver se acontece a mesma coisa.

Espero ter ajudado.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
kalin

Não concordo com a optimização apresentada:

alterar if(runing == false) para if(!frunning) não é uma optimização, já que o que é executado, e o que o compilador cria, é exactamente o mesmo.

Quanto mais, o código fica menor, mas também poderá ficar mais ilegível.

Na minha experiência o que mais faz pendurar os programas, é a criação de objectos, o lançamento de excepções e a comunicação entre threads, podendo estar aqui o problema do nosso colega, dai a minha sugestão de utilização de um widget já existente.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

O teu booleano 'running' é para verificar se o StopWatch() está a correr?

Se sim, porque não utilizas simplesmente a função do StopWatch() que te permite saber isso?

 if (watch.IsRunning) { }

Além do mais, podes inicializar logo um novo StopWatch() aquando o Load().

Portanto em vez de:

Private Stopwatch sw;

Terás:

Private Stopwatch sw = new Stopwatch();

De resto, não precisas de parar os cronómetros/relógios se estes não estiverem a trabalhar, pelo que apenas precisas de:

if (!watch.IsRunning) { // código }

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.