Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6873[/thread]

threads: kind an vater



<< >> 8 Einträge, 1 Seite
Froschpopo
 2005-04-08 07:36
#53597 #53597
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
guten morgen deutschland... eine produktive nacht liegt hinter mir.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl

use threads;
use threads::shared;

my $t = threads->new(\&kind);

sub kind {
    vater(); # Aufruf von Sub im Elternprozess
    return;
}

sub vater {
    # hier sind wir wieder im Elternprozess
}

anscheinend ist vater() auch noch im Kindprozess, ansonsten würden ja Tk-Funktionen beim Vater funktionieren.
Wie kann ich also vom Kindprozess ausgehend eine Funktion im Elternprozess starten?\n\n

<!--EDIT|Froschpopo|1112931396-->
Froschpopo
 2005-04-08 20:02
#53598 #53598
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
vielleicht könnte das Kind sowas zurückgeben wie:
Code: (dl )
1
2
return 'vater()'# sub bei vater
}


und ich nehme das dann mit nem eval() entgegen oder so.

aber das problem ist, dass sich der Kindprozess beendet wenn ich ein return mache... hat jemand eine Idee ?\n\n

<!--EDIT|Froschpopo|1112976263-->
Froschpopo
 2005-04-08 20:33
#53599 #53599
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
ich habs geschafft:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl

use strict;
use Tk;
use threads qw(yield);
use threads::shared;

my $win = MainWindow->new();

my $t = threads->new(\&kind);

sub kind {
    sleep(3);
    eltern("hallo Mama");
    return;
}

sub eltern {
    $win->configure(-title=>"$_[0]");
}

MainLoop;

Das funktioniert jetzt! Nach 3 Sekunden ändert er das Tk-Fenster !
Allerdings gibt es danach ne Meldung: (nach ändern des -title)
Code: (dl )
1
2
3
4
Tk::Error: Can't call method "Call" on an undefined value at C:/Perl/site/lib/Tk
/After.pm line 89.
[once,[{},after#1,idle,once,[ConfigChanged,{},{}]]]
("after" script)

Versteh ich irgendwie nicht\n\n

<!--EDIT|Froschpopo|1112978208-->
esskar
 2005-04-08 20:33
#53600 #53600
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
geht nicht;
irgendwie hab ich das gefühl, du verstehst das ganze nicht wirklich!
Froschpopo
 2005-04-08 20:34
#53601 #53601
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
siehe letzter post
Froschpopo
 2005-04-08 20:41
#53602 #53602
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
so funktionierts endlich:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl

use strict;
use Tk;
use threads qw(yield);
use threads::shared;

my $win = MainWindow->new(-title => "man");

my $t = threads->new(\&kind);

sub kind {
    sleep(3);
    $win->configure(-title=>"dad");
    $win->update();
    return;
}

MainLoop;


Aber eine Frage hab ich noch:
Warum geht das auch, wenn ich $win nicht share?
Also es bedarf keines share($win), funzt trotzdem! WARUM?

Danke allen, thema beendet!\n\n

<!--EDIT|Froschpopo|1112978581-->
esskar
 2005-04-08 21:35
#53603 #53603
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
das share regelt, dass immer nur ein thread auf die variable zugreift.
überleg dir mal folgendes:
du deklarierst eine variable mit 0;
jetzt versuchen 2 threads (also z.b. ein kind und ein papa) die variable zu schreiben; das geht dann nicht gut!
Froschpopo
 2005-04-08 21:43
#53604 #53604
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
der papa soll ja nur lesen ! Das Kind soll dann die GUI aktualisieren.
Das brauch man z.b. wenn man eine Statusleiste in echtzeit aktualisieren will.
<< >> 8 Einträge, 1 Seite



View all threads created 2005-04-08 07:36.