Sleep

1. Sleep

cléo
sayde

(usa Outra)

Enviado em 06/04/2016 - 08:43h

Bom minha duvida e meio noob to começando agora com perl, queria alguma forma de usar o sleep sem travar o resto do script e teria que ser um loop pra ficar repetindo a mensagem a cada 50 segundos, desde já agradeço por qualquer ajuda.
while (sleep 50) {
message "Wello word';
}


  


2. Re: Sleep

Daniel Vinciguerra
dvinciguerra

(usa Debian)

Enviado em 06/04/2016 - 09:38h

Seria melhor conhecer o cenário antes de sair sugerindo algo mas acho que para o seu problema um fork com um while(1) ja ajudaria.

#!/usr/bin/env perl 

# pragmas
use 5.10.0;
use strict;
use warnings;


# configuration
my $conf = {
sleep_time => 50
};


# cria um novo processo
my $pid = fork;
die "Não foi possivel criar um processo filho." unless defined $pid;

# chama a sub message no processo filho
if($pid){
message("Wello word");
}

# continuando o script
say "Processo pai continua aqui! :)";



sub message {
my $message = shift;
while(1){
sleep $conf->{sleep_time};
say "Mensagem: ${message}";
}
}


Referencias:
http://perldoc.perl.org/perlfork.html

Espero ter ajudado!

Grande abraço


3. Re: Sleep

cléo
sayde

(usa Outra)

Enviado em 06/04/2016 - 10:18h

obrigado deu certo a alguma forma de trocar a cor dessa mensagem?


4. Re: Sleep

Paulo
paulo1205

(usa Ubuntu)

Enviado em 06/04/2016 - 10:23h

A suposição do sleep é justamente parar o processamento por um período de tempo (ou até o recebimento de um sinal externo).

Se tudo o que você quer é imprimir periodicamente uma mensagem do tipo "estou vivo", enquanto programa faz outra coisa, pode usar um timer e uma função tratadora de sinais.

Por exemplo, o código abaixo ajusta um alarme para dez segundos, com repetições posteriores a cada 7,5 segundos. A cada alarme, a função tratadora do sinal de alarme faz tocar um beep no terminal.

use Time::HiRes qw(setitimer ITIMER_REAL);

sub alrm_handler {
print STDERR "\a";
}

$SIG{"ALRM"}=\&alrm_handler;
setitimer(ITIMER_REAL, 10, 7.5);

# Aqui faz um processamento demorado qualquer.
# No meu caso, vou calcular um bilhão de cossenos.
$c=0;
for($i=0; $i<1000000000; $i++){
$c=cos($c);
}


Eu frequentemente prefiro essa abordagem a criar múltiplas threads ou processos.


5. Re: Sleep

Paulo
paulo1205

(usa Ubuntu)

Enviado em 06/04/2016 - 10:32h

dvinciguerra escreveu:

Seria melhor conhecer o cenário antes de sair sugerindo algo mas acho que para o seu problema um fork com um while(1) ja ajudaria.


Do jeito como você fez, ele teria de lembrar de matar o processo filho e de chamar waitpid. Caso contrário, o processo que fica só “pingando” vai permanecer executando depois que o programa principal acabar.


6. Re: Sleep

cléo
sayde

(usa Outra)

Enviado em 06/04/2016 - 10:38h

Esse e meu código o que quero e adicionar uma mensagem que rode nele a cada 50 segundos no caso essa mensagem só que tem que estar na cor verde
Atualização semanal http://openkorebrasil.org/ By Sayd.

package connection;
use strict;
use Plugins;
use Log qw(message);
use Globals;
use Network::Send::bRO;
use Network::Receive::bRO;

*Network::Receive::bRO::new=sub{my($lOOl00100Oo)=@_;
my $self=$lOOl00100Oo->Network::Receive::ServerType0::new(@_);
my %packets = (
'0097' => ['private_message', 'v Z24 V Z*', [qw(len privMsgUser flag privMsg)]], # -1
);
# Sync Ex Reply Array
$self->{sync_ex_reply} = {
'095B', '0893', '08AD', '0860', '08A0', '0923', '0894', '0882', '0202', '087F', '0937', '0969', '0361', '0873', '0889', '095F', '0878', '0815', '095A', '095C', '094D', '0802', '0881', '0939', '0917', '0955', '0366', '093A', '089B', '0896', '0872', '086C', '0936', '0898', '08A1', '035F', '0360', '0964', '0919', '08A2', '0819', '0953', '0931', '0960', '0362', '0891', '0890', '08A6', '0925', '0888', '091E', '089D', '0365', '0956', '0954', '0963', '0883', '0886', '08A8', '0938', '0811', '093D', '0967', '0951', '0835', '091F', '0876', '091D', '0868', '0940', '092B', '0946', '0922', '085F', '07EC', '0437', '092C', '0952', '087E', '088C', '0918', '093F', '08A9', '023B', '089F', '0817', '095E', '0934', '0871', '08A3', '0965', '0944', '0367', '08A4', '0949', '0866', '0927', '0863', '086E', '0865', '088D', '0941', '0928', '092D', '0932', '0924', '0926', '0864', '087C', '0869', '08A5', '0838', '0369', '088A', '086A', '0438', '096A', '0861', '0364', '092E', '0892', '0887', '0875', '0962', '085E', '08A7', '091B', '0862', '0929', '094F', '0921', '085A', '085D', '0968', '0368', '093C', '091C', '07E4', '092A', '094B', '088F', '086D', '0933', '022D', '0961', '08AC', '095D', '086F', '094E', '089A', '087D', '089E', '094C', '0884', '0948', '08AB', '0959', '0945', '0363', '0950', '02C4', '0870', '0281', '0930', '0877', '087B', '092F', '08AA',
};

foreach my $key (keys %{$self->{sync_ex_reply}}) { $packets{$key} = ['sync_request_ex']; }
foreach my $switch (keys %packets) { $self->{packet_list}{$switch} = $packets{$switch}; }
return $self;

};
*Network::Send::bRO::new=sub{my($lOOl00100Oo)=@_;
my$self=$lOOl00100Oo->Network::Send::ServerType0::new(@_);
my %packets = (
'0942' => ['actor_action', 'a4 C', [qw(targetID type)]],
'0436' => ['skill_use', 'v2 a4', [qw(lv skillID targetID)]],
'0879' => ['character_move','a3', [qw(coords)]],
'093B' => ['sync', 'V', [qw(time)]],
'0920' => ['actor_look_at', 'v C', [qw(head body)]],
'0897' => ['item_take', 'a4', [qw(ID)]],
'088E' => ['item_drop', 'v2', [qw(index amount)]],
'0935' => ['storage_item_add', 'v V', [qw(index amount)]],
'0867' => ['storage_item_remove', 'v V', [qw(index amount)]],
'085B' => ['skill_use_location', 'v4', [qw(lv skillID x y)]],
'089C' => ['actor_info_request', 'a4', [qw(ID)]],
'087A' => ['actor_name_request', 'a4', [qw(ID)]],
'083C' => ['item_list_res', 'v V2 a*', [qw(len type action itemInfo)]],
'0958' => ['map_login', 'a4 a4 a4 V C', [qw(accountID charID sessionID tick sex)]],
'088B' => ['party_join_request_by_name', 'Z24', [qw(partyName)]], #f
'0895' => ['homunculus_command', 'v C', [qw(commandType, commandID)]], #f
'0943' => ['storage_password'],
);

$self->{packet_list}{$_} = $packets{$_} for keys %packets;

my %handlers = qw(
master_login 02B0
buy_bulk_vender 0801
party_setting 07D7
);

while (my ($k, $v) = each %packets) { $handlers{$v->[0]} = $k}
$self->{packet_lut}{$_} = $handlers{$_} for keys %handlers;
$self->cryptKeys(1561149935, 298664203, 1910900477);

return $self;
};
1



7. Re: Sleep

Daniel Vinciguerra
dvinciguerra

(usa Debian)

Enviado em 06/04/2016 - 10:40h

paulo1205,

"Seria melhor conhecer o cenário antes de sair sugerindo algo..."
Tudo que eu fiz foi dar as referencias... (até por que a documentação oficial carece de exemplos práticos)

Dependendo do cenário dele um scheduler como o cron já seria o suficiente... ou ele poderia utilizar algum framework de eventos como o IO::Assync!

Abs,


8. Re: Sleep

Daniel Vinciguerra
dvinciguerra

(usa Debian)

Enviado em 06/04/2016 - 10:45h

Pronto!
Agora eu já sei que ele quer mexer com bots de Ragnarok! =P



9. Re: Sleep

Paulo
paulo1205

(usa Ubuntu)

Enviado em 06/04/2016 - 10:59h

Sim, e o pedaço que ele mostrou é implementação de uma biblioteca (package). Acho que nenhuma das abordagens é boa numa biblioteca.