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

system

Leser: 1


<< >> 4 Einträge, 1 Seite
Gast Gast
 2004-02-22 14:16
#80278 #80278
hallo miteinander,

ich habe folgendes problem:

aus einer perl/tk-anwendung rufe ich mittels der funktion 'system' eine weitere perl/tk anwendung auf. nun ist aber die erste anwendung solange 'blockiert' bis die arbeit der aufgerufenen anwendung beendet ist. ich möchte aber in beiden anwendungen arbeiten können. ich weiss, dass es möglich ist system so aufzurufen, dass die aufrufende anwendung nicht blockiert ist - leider weiss ich nicht wie.

kann jemand helfen?

danke helmut
Strat
 2004-02-22 14:24
#80279 #80279
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
da fallen mir nur die beiden folgenden moeglichkeiten ein:

unter Windows: den neuen Prozess mit CPAN:Win32::Process zu starten

unter Linux/Solaris ganz am anfang des Programmes (vor Mainwindow->new(), da Tk wohl noch immer nicht mit fork umgehen kann) mit fork einen eigenen Prozess (=helperprocess) abzuspalten, und den fuer das Ausfuehren des externen Kommandos entweder mit exec ueberlagern (dann ist der danach weg) oder den erneut mit fork aufspalten und den childprozess mit exec durch das externe programm ueberlagern (hat den vorteil, dass der helperprozess) fuer weitere executes weiterlebt. Dieser Weg funktioniert allerdings nicht unter Windows, weil fork dort auf Basis von iThreads nachgebaut ist
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Ishka
 2004-02-23 00:22
#80280 #80280
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
unter Linux geht das sogar noch einfacher (dh. im Prinzip macht es das, ist aber weniger Schreibaufwand):
system("Programm &")
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}
ptk
 2004-02-23 12:29
#80281 #80281
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Strat,22.Feb..2004, 13:24]da fallen mir nur die beiden folgenden moeglichkeiten ein:

unter Windows: den neuen Prozess mit CPAN:Win32::Process zu starten

unter Linux/Solaris ganz am anfang des Programmes (vor Mainwindow->new(), da Tk wohl noch immer nicht mit fork umgehen kann)
[/quote] Das stimmt so nicht: man kann auch mitten in einem Tk-Programm ein fork() machen. Man muss aber dabei achten, dass man CORE::exit statt nur exit verwendet, weil exit unter Tk in Wirklichkeit Tk::exit ist und auch das MainWindow schliesst. Leider hat sich bei Tk804.025beta1 bis 14 ein Bug eingeschlichen, der dafuer sorgt, dass auch CORE::exit nicht hilft. Hier muss man das Hardcore-Exit POSIX::_exit verwenden. Ein Patch ist aber bei Nick und sollte in beta15 enthalten sein.

Was man natuerlich noch immer nicht machen darf, ist das Verwenden von Tk-Kommandos in *beiden* Prozessen.
<< >> 4 Einträge, 1 Seite



View all threads created 2004-02-22 14:16.