Schrift
[thread]6061[/thread]

Referenzen an Threads



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Gast Gast
 2004-02-07 21:04
#79924 #79924
Hi...

Mein Problem sieht wie folgt aus: Ich habe ein Object erstellt mittels bless() und möchte dieses Objekt an 2 Threads übergeben, nun handelt es sich bei einem Objekt ja immer um eine Referenz und diese wird immer verändert wenn ich sie an einen thread übergebe, ich habe einiges ausprobiert, aber die Adresse meines Objektes wird immer geändert und ich habe keine Chance auf das Objekt zuzugreifen! Hat jemand erfahrung oder kann mir einen Tip geben?

ciao ExRevel
Ishka
 2004-02-07 21:15
#79925 #79925
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Wie sieht denn dein code aus?
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
ExRevel
 2004-02-07 21:29
#79926 #79926
User since
2004-02-07
3 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ok, hier mal das Grobe:
Code: (dl )
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
while(1){

my $identification = @player;

$network->accept_client($identification);

if( $identification > ${$ptr_server_config}{'MAX_PLAYER'} ){

$network->protocol_error_max_player($identification);
}

$player[$identification] = cwt::player->new($identification);

$pthread_array[$identification] = threads->new(\&player_thread, $identification, $player[$identification]);

$cthread_array[$identification] = threads->new(\&controling_thread, $identification, $player[$identification]);

}

....

sub player_thread {

       my $ID = $_[0];
       my $player_object = $_[1];

       ....
}

sub controling_thread {

       my $ID = $_[0];
       my $player_object = $_[1];

       ....
}

Also, wie schon gesagt rufe ich mit cwt::player->new($identification) ein neues Objekt ins leben kann das ich in einem Arrayelement speicher. Nun will ich dieses Objekt an die beiden threads übergeben, doch dies funktioniert nicht, da die Adressen der Referenzen bei der Übergabe verändert werden und es somit unmöglich ist auf das gleiche Objekt mit beiden Threads zuzugreifen.

ciao Exi\n\n

<!--EDIT|ExRevel|1076182235-->
Ishka
 2004-02-07 21:32
#79927 #79927
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
- wie schaut die new-Routine im Paket threads aus
- verwendest du strict und warnings?
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
ExRevel
 2004-02-07 21:46
#79928 #79928
User since
2004-02-07
3 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Ishka,07.02.2004, 20:32]- wie schaut die new-Routine im Paket threads aus
- verwendest du strict und warnings?[/quote]
Also wie die new-Routine vom threads Packet genau aussieht kann ich dir nicht sagen, da ich sie noch nicht gelesen habe! :) Es handelt sich hierbei um die ithreads die ab 5.008 benutzt werden können, eingebunden mit use threads;

Und wie du an dem "my" sehen kannst nutze ich auch strict, was für dies Problem aber unerheblich ist. Ich habe auch schon etwas gefunden, was mir extrem schlechte laune macht:
Quote
bless is not supported on shared references. In the current version, bless will only bless the thread local reference and the blessing will not propagate to the other threads. This is expected to be implemented in a future version of Perl.


Ich werde nun noch ein bisschen was probieren und auch berichten.

ciao Exi
sri
 2004-02-07 21:54
#79929 #79929
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das was du vor hast klappt nicht, dein Objekt wird für jeden Thread neu kopiert/geklont!
Deshalb auch die unterschiedlichen Adressen.
Objekte können nicht geteilt werden.

Siehe:
perldoc perlthrtut\n\n

<!--EDIT|sri|1076184933-->
Ishka
 2004-02-07 21:55
#79930 #79930
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Hmm.. ok, dann kann ich das leider nicht lösen.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
ExRevel
 2004-02-07 22:08
#79931 #79931
User since
2004-02-07
3 Artikel
BenutzerIn
[Homepage] [default_avatar]
@sri jo steht ja in meinem post drin. Naja, das ist sehr schwach, und ich bin entäuscht von meiner lieblingssprache, vorallem wo ich jetzt wohl oder übel C nehmen muss.

Naja was solls...
sri
 2004-02-07 22:14
#79932 #79932
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=ExRevel,07.02.2004, 21:08]@sri jo steht ja in meinem post drin.[/quote]
Ups, stimmt... :)

Also mich hat dieser kleine Makel nie wirklich gestört, zumal das teilen verschachtelter Strukturen ja möglich ist.
Ishka
 2004-02-07 22:23
#79933 #79933
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Im Notfall gäbs ja noch die Version sich selbst ne Art bless zu schreiben, dann muß allerdings der Aufruf von den ganzen Sachen ein bissal anders aussehen (aber sauber ist das nicht).
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2004-02-07 21:04.