View Full Version : [c] executar um while durante 321 miliseconds


theforbidden1
21-05-2008, 17:54
Ola,

Eu queria executar um ciclo while durante pelo menos 321 miliseconds, como posso fazer isso?

MPalhas
21-05-2008, 17:58
como assim? queres apenas parar o programa durante esse tempo?
para isso basta sleep(321), não há necessidade de usar um while

agora se queres executar código durante o while mas parando após esse tempo já e mais complicado, nem sei se dá. talvez se fores contando o tempo após cada instrução, mas não sei como fazer isso

andrepadez
21-05-2008, 18:14
Hello,

Há pouco tempo fiz algo parecido em C#.

Não sei se o C tem classes parecidas com as que vou usar mas vou presumir que sim:

DateTime.Now - Guarda o valor da data e hora instantâneas.
TimeSpan - Classe para tratar diferença entre datas.

Se eu fizer qq coisa do Género:


DateTime inicio = DateTime.Now;
DateTime agora = DateTime.Now;
TimeSpan diferenca = agora.Subtract(inicio);

While (diferenca.Milliseconds < 321)
{
código....
.............
agora = DateTime.Now;
diferenca = agora.Subtract(inicio);
}


isto resulta em CSharp;
Ter em atenção que a precisão não é ideal. Mais uma vez, em Csharp, queria que ele me parasse aos 999 milisegundos (diferenca.Miliseconds == 999) e tive de me contentar com (diferenca.Miliseconds > 950)

Espero que tenha ajudado alguma coisa

The_True_Eue
21-05-2008, 19:01
Se queres executar algo dentro do ciclo com esse limite de tempo, tens de registar um signal handler para SIGALARM e marcar um alarm() para esse tempo, interrompendo assim o ciclo.

Assim não necessitas de fazer espera activa (verificar se já passou o tempo) poupando preciosos ciclos de CPU.

P.S.: Isto só funciona em UNIX e como deve ser óbvio, em sistemas com timers com mais resolução do que 312 ms... (sim, alguns não têm muito mais...)

theforbidden1
22-05-2008, 13:44
Se queres executar algo dentro do ciclo com esse limite de tempo, tens de registar um signal handler para SIGALARM e marcar um alarm() para esse tempo, interrompendo assim o ciclo.

Assim não necessitas de fazer espera activa (verificar se já passou o tempo) poupando preciosos ciclos de CPU.

P.S.: Isto só funciona em UNIX e como deve ser óbvio, em sistemas com timers com mais resolução do que 312 ms... (sim, alguns não têm muito mais...)

era mais o minimo de tempo que aquele conjunto de instruções iria ficar á espera de reber algo (ex. um semaforo, um socket). O utilizador andre já concebeu bem algoritmo. so que ele está a usar funcoes c# e eu quero em c