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

threads::shared und Pipes per IO::Handle

Leser: 2


<< >> 4 Einträge, 1 Seite
Mips
 2007-06-04 18:02
#77228 #77228
User since
2007-06-04
3 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo zusammen,

ich habe ein Problem. Mein Hauptprogramm startet eine thread, welcher Werte über eine Pipe zurückliefern soll. Da IO::Pipe Objected nicht "geshared" werden koennen, habe ich das Problem versucht zu umgehen. Hier mal ein Beispiel code:
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
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/perl 


use Tk;
use threads;
use threads::shared;
use IO::Pipe;
use IO::Handle;

$|=1;
my $news = 0;
share($news);

my $pipe = IO::Handle->new();

my $thread = threads->create(\&t,$pipe);

$pipe->fdopen($pipeFileno,'r');

my $win = MainWindow->new();
$lb = $win->Listbox()->pack();
$win->repeat(100,sub{ update($pipe,$lb)});
MainLoop;

sub t{
$pipe->fdopen($pipeFileno,'w');
while(1) {
print time()."\n";
print $pipe "a\n";
$news=1;
sleep(2);
}
}

sub update {
my ($pipe,$lb)=@_;
# $pipe->fdopen($pipeFileno,'r');
if($news){
print "update\n";
my $tmp=<$pipe>;
chomp($tmp);
print "insert: $tmp\n";
$lb->insert('end',$tmp);
$news=0;
}
}


hierbei soll nur immer eine neue Option in die Listbox eingefüht werden. Zwar wird bei mir auch immer eine neue, aber leere Option eingefügt. Anscheinend kommt nichts aus der Pipe heraus ....

Ich kann mir das Phenomen nicht erklären, hat einer von euch Tipps, wie man so etwas löst?

danke für jegliche Tips

bye,
Mips

P.S.: test System: linux mit perl, v5.8.8 built for i486-linux-gnu-thread-multi
Strat
 2007-06-04 18:48
#77229 #77229
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Tk ist nicht threadsafe, von daher sollte man darauf achten, dass man den oder die threads erzeugt, bevor tk geladen wird, dann kann man Tk recht gut mit threads kombinieren (also require Tk anstelle von use Tk).

Das Sharen von Variablen zwischen Threads funktioniert derzeit nur mit einfachen Datenstrukturen, nicht aber mit Objekten. Also einfach eine einfache Datenstruktur (vielleicht reicht String?) sharen, und die ueber den thread aktualisieren. Im Hauptprogramm dann darauf achten, ob sich die Variable geaendert hat (vielleicht ueber eine Semaphore), und dann die gui-option ausfuehren. Dafuer bietet sich Tk::After an, oder auch via Events.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Mips
 2007-06-04 19:26
#77230 #77230
User since
2007-06-04
3 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo,

danke für die Tipps.
Leider ist die Idde mit den Strings nicht so praktikabel, da es sich nicht nur um eine Pipe handeln wird, sondern um ca. 40, da jeder thread mit einem verteiler sprechen muss und noch ein paar threads mit einander. Weitherin würde das managment der strings auch etwas kompliziert werden (locking, delte, etc.)
Tk kann leider auch nicht nach dem Starten der threads erst geladen werden, da dynamsich threads beednet und neu gestartet werden ... da bin ich dann wohl in einer sackgasse...

Eine Idee meinerseits wäre noch, dass ich das die ganze Kommunikation über sockets gelöst wird (loopback interface).
Kann ich mir denn stark ins Knie schiessen, wenn ich trotz dem Tk benutze mit threads?

Danke,
Den
renee
 2007-06-04 19:43
#77231 #77231
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Schau Dir mal CPAN:POE an. Damit könnte es vielleicht klappen.
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/
<< >> 4 Einträge, 1 Seite



View all threads created 2007-06-04 18:02.