Portal SAMP
[Ajuda] long callback varios debug - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] long callback varios debug (/showthread.php?tid=4962)



long callback varios debug - fear - 26/01/2025

pelo que vi e a public que fica atualizando horas e minutos jogados...

Código PHP:
forward Atts(playerid);
public 
Atts(playerid) {
    if (
Player_GetWalkingStyle(playerid) > && Walking_gsTimer[playerid] == -1) {
        new 
keysupdownleftright;
        
GetPlayerKeys(playeridkeysupdownleftright);
        if (((!!
updown || !!leftright) && (keys KEY_WALK))) {
            new 
temp_index_anim GetPlayerAnimationIndex(playerid);
            for (new 
0sizeof indexes_animationsi++) {
                if (
temp_index_anim == indexes_animations[i]) {
                    
ApplyAnimation(playerid"PED"NameAnimations[_Walking_gsStyle[playerid] - 1], 4.111111);
                    
timer_WalkAnimation(playerid);
                    break;
                }
            }
        }
    }

    if (
PlayerInfo[playerid][PCongelado] == true)
        return 
TogglePlayerControllable(playerid0);

    if (
PlayerInfo[playerid][Reparo] == true)
        return 
RepairVehicle(GetPlayerVehicleID(playerid));

    
PlayerInfo[playerid][pSegJogado]++;

    if (
PlayerInfo[playerid][pSegJogado] == 59) {
        
PlayerInfo[playerid][pMinJogado] += 1;
        
PlayerInfo[playerid][pSegJogado] = 0;
    }
    if (
PlayerInfo[playerid][pMinJogado] == 59) {
        
PlayerInfo[playerid][pHoJogada] += 1;
        
PlayerInfo[playerid][pMinJogado] = 0;
    }
    
PlayerInfo[playerid][psegLogon]++;
    if (
PlayerInfo[playerid][psegLogon] == 59) {
        
PlayerInfo[playerid][psegLogon] = 0;
        
PlayerInfo[playerid][pminLogon]++;
        
PlayerInfo[playerid][minutosjogados]++;
    }
    if (
PlayerInfo[playerid][pminLogon] == 59) {
        
PlayerInfo[playerid][minutosjogados] = 0;
        
PlayerInfo[playerid][pminLogon] = 0;
        
PlayerInfo[playerid][phoraLogon]++;
        
PlayerInfo[playerid][horasjogados]++;
    }

    
GetPlayerPos(playeridPlayerInfo[playerid][pPos][0], PlayerInfo[playerid][pPos][1], PlayerInfo[playerid][pPos][2]);
    
GetPlayerFacingAngle(playeridPlayerInfo[playerid][pPos][3]);

    if(
GetPlayerMoney(playerid) != PlayerInfo[playerid][money])
    {
        
ResetPlayerMoney(playerid);
        
GivePlayerMoney(playerid,PlayerInfo[playerid][money]);
    }
    return 
1;


onplayerconnect

Código PHP:
PlayerInfo[playerid][timerAtualizacao] = SetTimerEx("Atts"Segundos(1), true"i"playerid); 


[11:10:03] [debug] #0 00006bf8 in public OnPlayerUpdate (3) in NewZP.amx
[11:10:03] [debug] Long callback execution detected (hang or performance issue)

[11:10:01] [debug] #0 0010d9ac in public Atts (1) in NewZP.amx
[11:10:02] [debug] Long callback execution detected (hang or performance issue)


RE: long callback varios debug - BitSain - 26/01/2025

Você pode ignorar isso, ou até desabilitar. A include fornece uma função para isso.

Eu acho que os returns de tais condições (como reparo de veículo ou player congelado) não seriam necessários, mas eu também apontei o possível problema:
Código PHP:
forward Atts(playerid);
public 
Atts(playerid) {
    if(
Player_GetWalkingStyle(playerid) > && Walking_gsTimer[playerid] == -1) {
        new 
keysupdownleftright;
        
GetPlayerKeys(playeridkeysupdownleftright);
        if((!!
updown || !!leftright) && (keys KEY_WALK)) {
            new 
temp_index_anim GetPlayerAnimationIndex(playerid);
            for(new 
0sizeof indexes_animationsi++) { // Isso aqui pode estar causando o probelma descrito pelo crashdetect.
                
if(temp_index_anim == indexes_animations[i]) {
                    
ApplyAnimation(playerid"PED"NameAnimations[_Walking_gsStyle[playerid] - 1], 4.111111);
                    
timer_WalkAnimation(playerid);
                    break;
                }
            }
        }
    }
    
    if(
PlayerInfo[playerid][PCongelado]) TogglePlayerControllable(playeridfalse);

    if(
PlayerInfo[playerid][Reparo]) RepairVehicle(GetPlayerVehicleID(playerid));

    
PlayerInfo[playerid][pSegJogado]++;
    if(
PlayerInfo[playerid][pSegJogado] >= 59) {
        
PlayerInfo[playerid][pSegJogado] = 0;
        
PlayerInfo[playerid][pMinJogado]++;
    }

    if(
PlayerInfo[playerid][pMinJogado] >= 59) {
        
PlayerInfo[playerid][pMinJogado] = 0;
        
PlayerInfo[playerid][pHoJogada]++;
    }

    
PlayerInfo[playerid][psegLogon]++;
    if(
PlayerInfo[playerid][psegLogon] >= 59) {
        
PlayerInfo[playerid][psegLogon] = 0;
        
PlayerInfo[playerid][pminLogon]++;
        
PlayerInfo[playerid][minutosjogados]++;
    }

    if(
PlayerInfo[playerid][pminLogon] >= 59) {
        
PlayerInfo[playerid][pminLogon] = 0;
        
PlayerInfo[playerid][phoraLogon]++;
        
PlayerInfo[playerid][horasjogados]++;
    }

    
GetPlayerPos(playeridPlayerInfo[playerid][pPos][0], PlayerInfo[playerid][pPos][1], PlayerInfo[playerid][pPos][2]);
    
GetPlayerFacingAngle(playeridPlayerInfo[playerid][pPos][3]);

    if(
GetPlayerMoney(playerid) != PlayerInfo[playerid][money]) {
        
ResetPlayerMoney(playerid);
        
GivePlayerMoney(playeridPlayerInfo[playerid][money]);
    }
    return 
true;


Você chama algo aproximadamente a cada 1 segundo, só que dentro da função em que vc chama a cada 1 segundo, você sempre está fazendo um loop que roda N vezes.
Esse loop deve estar causando o problema descrito pelo crashdetect, sem duvidas.
Existem soluções muito melhores do que usar um loop nessa função em específico, não mostrei uma pq não sei a utilidade da variável "indexes_animations" e nem tem a definição da mesma.