|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Alan Long 2:5030/1082.72 26 Jan 2001 07:49:50 To : All Subject : Q: Perl/Tk -------------------------------------------------------------------------------- * Originally from Alan Long (2:5030/1082.72) to All. AL> Вот тут потребовалось вывести маленький график с использованием AL> Perl/Tk... В Perl/Tk, как впрочем и в Tcl/Tk я не силен, так что AL> решил спросить здесь... AL> Задача - вывести небольшой (60x60) график с network activity AL> (Данные я беру с SNMP) Вызов примерно следующий: AL> DrawStat( $image, $inCPS, $outCPS, $maxCPS ), где: AL> $image - какой-то объект куда выводится график; AL> $inCPS - число в диапазоне 0..$maxCPS, характерезующее входной AL> поток $outCPS - число в диапазоне 0..$maxCPS, характерезующее AL> выходной поток $maxCPS - Максимальное значение CPS на интерфейсе... AL> Куда смотреть, какие доки читать на предмет отрисовки... Вот тут сочинил, но что-то слишком много процессорного времени ест, может кто чего пооптималнее присоветует ? В данном примере данные берутся не с интрефейса а из rand ;-) Hо смысла это не меняет.. При работе на процессоре P-130, загрузка составляет (load avg.) 0.2, что для данной задачи многовато, IMHO. - -- #!/usr/bin/perl -w use strict; use Tk; my $m = undef; my $c = undef; my $width = 60; my $height = 60; my $max_val= 4500; my $delay = 2; my @y_val = (); my @x_val = (); { srand( time() ); $m = MainWindow->new; $c = $m->Canvas( -width => $width, -height => $height, -background => 'gray', ); # $c->createGrid( # 10, 10, # 20, 20, # -disabledcolor => 'blue', # ); $c->pack( -expand => 1, -fill => 'both', ); process(); MainLoop; } sub draw_line { my ( $a_ptr, $color) = ( shift, shift ); $c->createLine( map { $_, int( ($a_ptr->[$_] / $max_val) * $width ) } ( 1..$#$a_ptr ); -fill => $color, # -smooth => 1, ); } sub process { my_push( \@y_val, $width, int rand( $max_val ) ); my_push( \@x_val, $width, int rand( $max_val ) ); # Clear old graph $c->createRectangle( 0,0, $width,$height, -fill => 'black', ); draw_line( \@y_val, 'red' ); draw_line( \@x_val, 'green' ); $SIG{ALRM} = \&process; alarm( $delay ); } sub my_push { my ( $a_ptr, $max_len ) = ( shift, shift ); local $_; foreach ( @_ ) { shift @$a_ptr if( $#$a_ptr >= $max_len ); push( @$a_ptr, $_ ); } } - -- P.S. что-то указанный фрагмент (создание сетки) не работает, может я чего не правильно делаю ? $c->createGrid( 10, 10, 20, 20, -disabledcolor => 'blue', ); -- With best, Ъ-· Ъ Е-ЧLaі\і <alan@x-rays.eu.org> --- timEd/386 1.10+ * Origin: X - Rays Station (2:5030/1082.72) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/4581a70f5f70.html, оценка из 5, голосов 10
|