[Guia] No usar timers inadecuadamente y usar gettime()

Aprende lo que no sabes de este lenguaje y encuentra herramientas y códigos útiles.

Moderador: Ayudantes

Reglas del Foro
  • Si tu código es corto, no crees un tema nuevo para liberarlo, publica un mensaje en el tema [Funciones] ¡Publica tu código aquí!.
  • Si creas una guía, debes explicar el código claramente. Evita poner la explicación en forma de comentarios dentro del mismo y no olvides utilizar el BBCode correspondiente: [Pawn]Código aquí[/Pawn].
  • No postear códigos sin probar. Publicar códigos con errores (que impidan compilar el script para el cual está destinado) en este apartado es motivo de sanción.
  • Si tu código necesita plugins, includes u otros códigos adicionales para funcionar, debes mencionarlo en el mensaje.
  • Si has utilizado códigos de otros autores, recuerda colocar los créditos correspondientes. (El plagio es motivo de sanción).
  • Si tu aporte es para un GameMode en específico, debes publicar el tema en el apartado "Guías y Aportes para GameModes específicos".
Responder
Avatar de Usuario
Graber
Junior
Junior
Mensajes: 194
Registrado: 10 Abr 2016 19:16
Contactar:
Reputación: 22

19 Jul 2018 11:17

Hola comunidad, hoy quiero dirigirme a una pequeña mala practica que se hace al uso de timers. No estoy para hablar del SetTimer(Ex) que puede cumplir funciones que no se podrían hacer de otra manera, pero hay veces que los usamos un poco mal.

Un ejemplo de mal uso:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

new bool:NoPuedeUsarComando[MAX_PLAYERS];

CMD:comando(playerid, params[])
{
	if(NoPuedeUsarComando[playerid]) return SendClientMessage(playerid, -1, "No puedes usar este comando aun");

	SetTimerEx("PermitirUsarComando", 3000, false, "d", playerid);
	SendClientMessage(playerid, -1, "Usaste el comando");

	return 1;
}

forward PermitirUsarComando(playerid);
public PermitirUsarComando(playerid)
{
	NoPuedeUsarComando[playerid] = false;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 17
Esto, efectivamente va a funcionar, pero no es la manera adecuada de hacerlo. Por cada timer que se deja, aumenta el uso de memoria y de CPU.

gettime() es una función que cuenta los segundos desde 1 de enero de 1970 (si la usan ahora sera algo cercano a 1532016571). Podemos usar esta funcion a nuestro favor para guardar cuando un usuario usó un comando, o cuando puede volver a usarlo. Si usamos la funcion gettime(), no solo el código puede llegar a ser mas eficiente, sino que vamos a tener oportunidad de poder revisar, por ejemplo, cuanto tiempo falta, lo cual puede ser útil para el usuario:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

new CooldownComando[MAX_PLAYERS];

CMD:comando(playerid, params[])
{
	//si CooldownComando es mayor que el tiempo actual, significa que no ha pasado el tiemop suficiente.
	if(CooldownComando[playerid] > gettime())
	{
		new string[64];
		
		//restamos el tiempo cuando podrá usar el comando con el tiempo actual para obtener cuantos segundos faltan
		format(string, sizeof string, "Debes esperar %d segundos para volver a poder usar el comando",  CooldownComando[playerid] - gettime());
		SendClientMessage(playerid, -1, string);
		return 1;
	}

	//El usuario podrá usar el comando en 5 segundos (tiempo actual + 5)
	CooldownComando[playerid] = gettime() + 5;
	SendClientMessage(playerid, -1, "Usaste el comando");

	return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 21
Espero les sea útil
Imagen

No doy soporte por privado y no estoy disponible para ningún trabajo/proyecto/lo que sea. Eviten MPs de ese tema

Avatar de Usuario
#Fede
Moderador Global
Moderador Global
Mensajes: 3133
Registrado: 12 Ene 2015 06:32
Ubicación: Montevideo, Uruguay.
Reputación: 75

19 Jul 2018 11:24

Muy buena guía para los nuevos.

Pregunta rápida, ¿Esta función dejara de funcionar en Enero del 2038?
Estoy fuera de SA-MP, no me envíen mensajes privados invitándome a proyectos.


scriptnoob escribió:Cada día se va mejorando el foro, nuestro objetivo es como el de una empresa:

Misión: Brindar ayuda y aportes a los usuarios.
Visión: Ser la página de mayor calidad de servicio de soporte referidos a lenguajes de programación.
Lee las reglas del foro para evitar ser sancionado




Avatar de Usuario
Graber
Junior
Junior
Mensajes: 194
Registrado: 10 Abr 2016 19:16
Contactar:
Reputación: 22

19 Jul 2018 11:43

#Fede escribió:
19 Jul 2018 11:24
Muy buena guía para los nuevos.

Pregunta rápida, ¿Esta función dejara de funcionar en Enero del 2038?
Pues ya que SA-MP esta compilado en 32 bits, pues si, esperemos que Kalcor lo saque para 64 bit antes de eso -nosweat
Imagen

No doy soporte por privado y no estoy disponible para ningún trabajo/proyecto/lo que sea. Eviten MPs de ese tema

Avatar de Usuario
KaizerHind
Senior
Senior
Mensajes: 1974
Registrado: 01 Mar 2016 12:27
Ubicación: En algún lugar del mundo.
Contactar:
Reputación: 63

19 Jul 2018 12:17

Interesante guía para los nuevos como dice Fede.
Imagen

Actualmente retirado de Pawnscript, si usted desea comunicarse conmigo
puede escribirme en las redes que se encuentran en mi firma.

Desarrollador de Modelos - Versión 0.3 DL.
¿Quieres ver mi trabajo? Entra abajo en mi Pagina de contacto o Portafolio de diseño.

Imagen Pagina de Contacto. Imagen Portafolio de diseño.Imagen Canal de Youtube.ImagenKaizer#2694.


» Aportes dentro del Foro.
.
Avatar de Usuario
gloweryt
Junior
Junior
Mensajes: 195
Registrado: 16 May 2017 11:42
Ubicación: Colombia
Reputación: 11

19 Jul 2018 20:19

Wow, interesante y simple idea... -good
No te preocupes si no funciona bien. Si todo estuviera correcto, serías despedido de tu trabajo

-Ley Mosher de Ingeniería de Software


BonerMap
Aprendiz
Aprendiz
Mensajes: 330
Registrado: 01 Dic 2014 09:34
Ubicación: México
Contactar:
Reputación: 9

20 Jul 2018 17:43

Graber escribió:
19 Jul 2018 11:17
Hola comunidad, hoy quiero dirigirme a una pequeña mala practica que se hace al uso de timers. No estoy para hablar del SetTimer(Ex) que puede cumplir funciones que no se podrían hacer de otra manera, pero hay veces que los usamos un poco mal.

Un ejemplo de mal uso:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

new bool:NoPuedeUsarComando[MAX_PLAYERS];

CMD:comando(playerid, params[])
{
	if(NoPuedeUsarComando[playerid]) return SendClientMessage(playerid, -1, "No puedes usar este comando aun");

	SetTimerEx("PermitirUsarComando", 3000, false, "d", playerid);
	SendClientMessage(playerid, -1, "Usaste el comando");

	return 1;
}

forward PermitirUsarComando(playerid);
public PermitirUsarComando(playerid)
{
	NoPuedeUsarComando[playerid] = false;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 17
Esto, efectivamente va a funcionar, pero no es la manera adecuada de hacerlo. Por cada timer que se deja, aumenta el uso de memoria y de CPU.

gettime() es una función que cuenta los segundos desde 1 de enero de 1970 (si la usan ahora sera algo cercano a 1532016571). Podemos usar esta funcion a nuestro favor para guardar cuando un usuario usó un comando, o cuando puede volver a usarlo. Si usamos la funcion gettime(), no solo el código puede llegar a ser mas eficiente, sino que vamos a tener oportunidad de poder revisar, por ejemplo, cuanto tiempo falta, lo cual puede ser útil para el usuario:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

new CooldownComando[MAX_PLAYERS];

CMD:comando(playerid, params[])
{
	//si CooldownComando es mayor que el tiempo actual, significa que no ha pasado el tiemop suficiente.
	if(CooldownComando[playerid] > gettime())
	{
		new string[64];
		
		//restamos el tiempo cuando podrá usar el comando con el tiempo actual para obtener cuantos segundos faltan
		format(string, sizeof string, "Debes esperar %d segundos para volver a poder usar el comando",  CooldownComando[playerid] - gettime());
		SendClientMessage(playerid, -1, string);
		return 1;
	}

	//El usuario podrá usar el comando en 5 segundos (tiempo actual + 5)
	CooldownComando[playerid] = gettime() + 5;
	SendClientMessage(playerid, -1, "Usaste el comando");

	return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 21
Espero les sea útil
Buena guía.
//_____________________MIS PROYECTO_____________________________//
GO PLAYERS ROLEPLAY
______________________________________________________
_____________________APORTES A EL FORO_________________
Spoiler:
[Mapeo 24/7]:http://pawnscript.com/foro/viewtopic.php?t=3882
[APORTE[Sistema loro FZ]:http://pawnscript.com/foro/viewtopic.php?t=23531
[FS][Fiesta de la cerveza]:http://pawnscript.com/foro/viewtopic.php?f=81&t=28704
[APORTE]Localizar propiedad OZ:http://pawnscript.com/foro/viewtopic.php?f=40&t=28872
[APORTE] FC Para OZ:http://pawnscript.com/foro/viewtopic.php?f=40&t=28892
[APORTE Cambiar contraseña GM OZ]: http://pawnscript.com/foro/viewtopic.php?f=90&t=31309
[APORTE Cambiar nombre en el juego OZ]: http://pawnscript.com/foro/viewtopic.php?f=90&t=31308
//___________________________________________________________________________
Yo no soy programador.
Me gusta ayudar a la gente.
**************Prónto Médico********************************
Pwn: Mi pasatiempo :)
Responder