Schrift
[thread]5261[/thread]

tk script in laufender for für 2 sekunden anhalten



<< >> 6 Einträge, 1 Seite
popcorn5
 2006-11-27 18:59
#45969 #45969
User since
2003-09-24
60 Artikel
BenutzerIn
[default_avatar]
Hi,

ich mache ne Anfrage via RS232 an eine Maschine und erwarte eine antwort. Ich muss allerdings nochmal "nachfragen" um eine antwort zu bekommen und da das einen augenblick dauert, muss ich zwei sekunden warten. mit sleep() geht das nicht weil da die GUI einfriert. Achso, das ganze findet in einer Schleife statt, falls das wichtig ist ?

bin für jeden Lösungsvorschlag dankbar.

Danke\n\n

<!--EDIT|popcorn5|1164647296-->
betterworld
 2006-11-27 19:34
#45970 #45970
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
perldoc Tk::after

(Geht allerdings nicht in einer Schleife.)\n\n

<!--EDIT|betterworld|1164648887-->
popcorn5
 2006-11-27 19:44
#45971 #45971
User since
2003-09-24
60 Artikel
BenutzerIn
[default_avatar]
:) tja, ist aber nunmal eine schleife... muss auch, geht nicht anders. ich habe auch schon so gut wie alles durchprobiert.
jetzt werde ich es mal mit der uhrzeit probieren.
man nehme die aktuelle uhrzeit, rechne stunden, minuten und sekunden zusammen (in sekunden) und zähle 2 hinzu. nun eine einfacha while-schleife basteln... eben bis die uhrzeit "grösser" ist... das ist aber gebastel, evtl. fällt jemandem noch etwas ein.

mfg
renee
 2006-11-27 20:14
#45972 #45972
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wieso geht es nicht anders?

Wie wäre es, die for-Schleifen in eine Sub zu packen und diese Sub mit Tk::after aufzurufen?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
PerlProfi
 2006-11-29 21:56
#45973 #45973
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Man kann auch eine waitVariable() benutzen.
Ich würde sagen das wäre der sauberste Weg:
Code: (dl )
1
2
3
my $v=0;
$mw->after(5000, sub { $v=1 });
$mw->waitVariable(\$v);


Und das geht in einer Schleife:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
use strict;
use warnings 'all';
use Tk;

my $mw = tkinit;

for (0..100)
{
my $v=0;
$mw->after(100, sub { $v=1 });
$mw->waitVariable(\$v);

print "Nummer $_\n";
}

exit;


Ich glaube da gibt es nur bei Windows einen Fehler. Wenn man die Titelzeile des Fensters anklickt, bleiben alle Ereignisse der GUI stehen, bis man wieder loslässt.
Das dürfte aber kein Problem sein, oder?

- PerlProfi -
ptk
 2006-11-30 02:12
#45974 #45974
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich habe das mal in einer Tk-Methode generalisiert:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
=head2 tk_sleep

=for category Tk

$top->tk_sleep($s);

Sleep $s seconds (fractions are allowed). Use this method in Tk
programs rather than the blocking sleep function. The difference to
$top->after($s/1000) is that update events are still allowed in the
sleeping time.

=cut

sub Tk::Widget::tk_sleep {
my($top, $s) = @_;
my $sleep_dummy = 0;
$top->after($s*1000,
sub { $sleep_dummy++ });
$top->waitVariable(\$sleep_dummy)
unless $sleep_dummy;
}
<< >> 6 Einträge, 1 Seite



View all threads created 2006-11-27 18:59.