Jump to content
Windows Dragon

Problemas ao criar um "Stopwatch"

Recommended Posts

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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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 }

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.