if $i > 100 then ...
if timer then
$i > 100
$i<=100
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
#!/usr/bin/perl use warnings; use strict; use Tk; package Window; sub new { my $classname = shift; my $self = {timerstart => 3}; return bless($self, $classname); } sub showWindow { my $self = shift; $self->{timer} = $self->{timerstart}; $self->{mw} = MainWindow->new(); $self->{mw}->optionAdd("*font", "Arial 12 normal"); $self->{mw}->title("Timer"); $self->{mw}->geometry("+416+347"); $self->{mw}->bind('<Control-q>', sub { $self->{mw}->destroy() }); $self->{lab} = $self->{mw}->Label(-text => $self->{timer}); $self->{lab}->pack(-padx => 20, -pady => 20); $self->{fr1} = $self->{mw}->Frame(); $self->{btn_start} = $self->{fr1}->Button(-text => "Start", -command => sub { $self->start() }); $self->{btn_start}->pack(-side => "left", -padx => 50); $self->{fr1}->pack(); $self->{mw}->MainLoop(); } sub start { my $self = shift; if ($self->{timer} < $self->{timerstart}) { return; } $self->{mw}->after(100, sub { $self->doTimer() }); } sub doTimer { my $self = shift; $self->{timer} -= 0.1; $self->{timer} = sprintf("%.1f", $self->{timer}); $self->updateLabel($self->{timer}); if ($self->{timer} > 0) { $self->{mw}->after(100, sub { $self->doTimer() }); } else { $self->updateLabel("Timer abgelaufen"); $self->{timer} = $self->{timerstart}; } } sub updateLabel { my $self = shift; my $text = shift; $self->{lab}->configure(-text => $text); } package main; my $w = Window->new(); $w->showWindow();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
#!/usr/bin/perl use 5.14.0; use warnings; use threads; use threads::shared; use Thread::Suspend; my $i : shared = 0; my $worker = threads->create(sub { threads->self()->suspend(); while (1) { say "Ich laufe nur, wenn i > 100"; sleep 1; } }); my $ueberwacher = threads->create(sub { while (1) { select undef, undef, undef, 0.1 while $i <= 100; $worker->resume(); select undef, undef, undef, 0.1 while $i > 100; $worker->suspend(); } }); while (1) { print "Neuer Wert fuer i: "; chomp(my $answer = <STDIN>); last unless defined $answer; $i = $answer; $_->join() for threads->list(threads::joinable); }
1
2
3
4
5
6
7
8
while(1)
{
if $i > 100 && Timer(5s) then ....
if $x > 1 && Timer(500ms) then ....
if $y > 100 && $z < -20 && Timer(5s) then ....
}
2015-06-03T08:16:06 RaubtierIch verstehe deine Hauptschleife nicht. Was soll Timer(5s) tun?
Mach doch mal ein Beispiel. Wenn jetzt i > 100, dann soll 5 Sekunden später etwas ausgegeben werden? Wenn ja, nur genau einmal? Und wenn i während der 5s wieder unter 100 fallen sollte, was ist dann? Und wenn dann i wieder > 100 ist, was ist dann? Starten die 5s dann erneut oder läuft die Zeit dann weiter?
1
2
if $i > 100 && timer_start("timer_1", 5s) // Timer_1 startet und läuft solange $i > 100 bleibt
Funktion z.B. erzeuge Meldung
1
2
if timer_start("timer_1",$i > 100, 5s) // Timer_1 (irgend eine Name) startet und läuft solange $i > 100 bleibt
Funktion z.B. erzeuge Meldung
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/perl -w
use warnings;
use strict;
package timer;
########################################################################################
sub new
{
my $classname = shift;
my $self = {timerstart => 0};
return bless($self, $classname);
}
########################################################################################
sub TON
{
my $self = shift;
my $vke = shift;
my $zeit = shift;
if ($vke == 0)
{
$self->{timerstart} = 0;
$self->{aktzeit} = 0;
return 0;
}
#Timer initialisieren
if ($self->{timerstart} == 0 && $vke == 1)
{
$self->{timerstart} = 1;
$self->{aktzeit} = $zeit;
}
if ($self->{timerstart} = 1 && $self->{aktzeit} > 0 )
{
$self->{aktzeit} -= 0.8;
print "Timer noch nicht 0\n";
return 0;
}
else
{
$self->{aktzeit} = 0;
print "Timer ist 0\n";
return 1;
}
}
########################################################################################
my $timer_1 = timer->new();
my $retval_timer_1;
while (1)
{
sleep(1);
$retval_timer_1 = $timer_1->TON(1,10);
print "$retval_timer_1=$timer_1->{aktzeit}\n";
}
Guest pietCode: (dl )if ($self->{timerstart} = 1 && $self->{aktzeit} > 0 )
Guest pietWenn also [also = schönes Wort :-) ] $i > 100 ist/wird, starten/laufen die z.B. 5 Sekunden. d.h. Bedingung für den Timer ist immer die Bedingung $i > 100
Als Rückgabewert bringt der timer_start("timer_1", 5s)
1. 0=Zeit läuft noch
2. 1=Zeit ist abgelaufen
Während die Zeit läuft bringt die timer_restzeit("timer_1") die Restzeit zurück
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
#!/usr/bin/perl use warnings; use strict; use 5.14.0; use threads; use threads::shared; use Time::HiRes qw(usleep); my @results = (); package Timer; sub new { my $classname = shift; my $self = {comparevalue => 0, limit => 100, timerstart => 5, state => "off", round => 0, stopthread => 0}; return bless($self, $classname); } sub startThread { my $self = shift; $self->{timer} = $self->{timerstart}; threads::shared::share($self->{timerstart}); threads::shared::share($self->{timer}); threads::shared::share($self->{comparevalue}); threads::shared::share($self->{limit}); threads::shared::share($self->{state}); threads::shared::share($self->{round}); threads::shared::share($self->{stopthread}); threads::shared::share(@results); $self->{thread} = threads->create(sub { $self->myThread() }); } sub myThread { my $self = shift; while ($self->{stopthread} == 0) { if ($self->{comparevalue} > $self->{limit}) { $self->{timer} = $self->{timerstart}; my $result = $self->runLoop(); push(@results, $result); } } } sub runLoop { my $self = shift; $self->{round}++; $self->{state} = "on"; while ($self->{timer} >= 0) { if ($self->{comparevalue} <= $self->{limit}) { $self->{state} = "off"; return 0; } Time::HiRes::usleep(100000); $self->{timer} -= 0.1; $self->{timer} = sprintf("%.1f", $self->{timer}); } $self->{state} = "off"; return 1; } sub getAktZeit { my $self = shift; return $self->{timer}; } sub getStatus { my $self = shift; return $self->{state}; } sub getRound { my $self = shift; return $self->{round}; } sub setCompareValue { my $self = shift; $self->{comparevalue} = shift; } sub stopThread { my $self = shift; $self->{stopthread} = 1; $self->{thread}->detach(); } package main; my $i = 0; my $timer = Timer->new(); $timer->startThread(); my $u; print "\$i\tTimerStatus\tTimerrestzeit\tTimerrunde\n"; for ($u = 0; $u <= 100; $u++) { $timer->setCompareValue($i); print "$i\t\t"; print $timer->getStatus() . "\t\t"; print $timer->getAktZeit() . "\t\t"; print $timer->getRound() . "\n"; Time::HiRes::usleep(200000); if ($u == 5 || $u == 40) { $i = 105; } if ($u == 20) { $i = 10; } } $timer->stopThread(); print "\nErgebnisse:\n"; print "Timerrunde\tErgebnis\n"; for $u (0 .. $#results) { print $u + 1; print "\t\t$results[$u]\n"; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
#!/usr/bin/perl -w use warnings; use strict; package timer; ######################################################################################## sub new { my $classname = shift; my $self = {timerstart => 0, startzeit => 0, aktzeit => 0, endzeit => 0}; return bless($self, $classname); } ######################################################################################## sub TON { my $self = shift; my $vke = shift; my $laufzeit = shift; if ($vke == 0) { $self->{timerstart} = 0; $self->{aktzeit} = 0; return 0; } #Timer initialisieren if ($self->{timerstart} == 0 && $vke == 1) { $self->{timerstart} = 1; $self->{startzeit} = `(date +%s%N)` / 1000000; $self->{endzeit} = $self->{startzeit} + $laufzeit; $self->{aktzeit} = int($self->{endzeit} - $self->{startzeit}); } if ($self->{timerstart} && $self->{aktzeit} > 0 ) { $self->{aktzeit} = int($self->{endzeit} - `(date +%s%N)` / 1000000); return 0; } else { $self->{aktzeit} = 0; return 1; } } ######################################################################################## my $timer_1 = timer->new(); while (1) { sleep(1); if ($timer_1->TON(1,10000)) { print "Zeit ist abgelaufen\n"; } else { print "Zeit läuft=".int($timer_1->{aktzeit}/1000)."\n"; } }
Guest pietDa ich keine andere Möglichkeit als einen Shellbefehl gefunden habe ... war dies für mich die Lösung.
$timer_1->TON($i > 100,10000)
1 2 3 4 5 6 7 8 9 10 11
my $timer_1 = timer->new(); while (1) { sleep(1); if ($timer_1->TON($i > 100,10000)) # vke = $i > 100 = 1 { print '$i > 100 und Zeit ist abgelaufen'.\n"; } else { print "Zeit läuft=".int($timer_1->{aktzeit}/1000)."\n"; } # Zeit läuft noch wenn $i > 100 oder Zeit läuft nicht wenn $i <=100, nur erkennbar ob "aktzeit" = 0 oder "aktzeit" >< 0 }
$timer_1->{aktzeit}
QuoteMöglicherweise könntest Du auch nur die jeweilige Systemzeit abfragen und diese vergleichen.
QuoteHast Du gut umgesetzt.
Time::HiRes
1
2
3
4
[10:31:41] ~$ perl -E'say time'
1434529907
[10:31:47] ~$ perl -E'use Time::HiRes qw(time); say time'
1434529909.81944