Schrift
[thread]203[/thread]

Prozess fernsteuern: er soll nicht auf Rückgabewert warten!



<< >> 8 Einträge, 1 Seite
kölsch
 2004-03-12 14:28
#1620 #1620
User since
2003-10-02
66 Artikel
BenutzerIn
[default_avatar]
Hi,
ich möchte mit einer Methode start() (s.u.) einen "quasi" Endlos-Prozess starten.
Das heißt konkret: wenn ich den Start-Button drücke, wird die Methode start() aufgerufen, und der Prozess wird gestartet. Danach soll er wieder zurück zum Hauptframe &mainControlFrame() (mit dem Start und Stop Button) zurück, wo ich den Prozess wieder mit stop() beenden kann. Mein Problem dabei ist aber, dass er nicht zu diesem Frame zurückkehrt weil er auf einen Rückgabewert von enlessLoop() wartet. Wie kann ich das verhindern?
'exec' machts übrigens auch nicht.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sub start {

# check-Variable auf 1 (on) stellen..
open (ONOFF,">OnOff.num") || die ("Can't open OnOff.num!");
flock(ONOFF, 2)  or &cgierr("unable to get exclusive lock on OnOff.num.\nReason: $!");
print ONOFF "1";
close ONOFF;


#&endlessLoop(); # geht so nicht weil auf return-value wartet..

# hier wartet er auch! -> warum?
{ exec  (&endlessLoop()) };  print STDERR "couldn't exec &endlessLoop(): $!";


&mainControlFrame(); # zurück zum HauptFrame..
}


Würde mir ein Thread weiterhelfen, oder wär ich da auf dem ganz falschen Dampfer?

Vielen Dank,
Gruß Daniel\n\n

<!--EDIT|kölsch|1079094578-->
ptk
 2004-03-12 14:40
#1621 #1621
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Du brauchst fork(). Dabei wird ein echter Prozess (Unix) oder ein Interpreterthread (Win32) gestartet.
kölsch
 2004-03-15 14:27
#1622 #1622
User since
2003-10-02
66 Artikel
BenutzerIn
[default_avatar]
Mit fork() bin ich nicht zurechtgekommen, habs jetzt so gemacht:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
use WIN32::Process;
use WIN32;

sub ErrorReport{

print Win32::FormatMessage( Win32::GetLastError() );

}

Win32::Process::Create($ProcessObj,

"C:\\Perl\\bin\\perl.exe",

'perl endless.pl',

0,

NORMAL_PRIORITY_CLASS,

".")|| die ErrorReport();


endless.pl besteht aus einer while-Schleife, die bei jedem Durchgang eine check-variable überprüft (on/off), wenn off dann beendet endless.pl. Muss ich dann noch den Prozess manuell killen, oder irgendwelchen trash beseitigen?
ptk
 2004-03-15 15:53
#1623 #1623
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
fork() musst du wie folgt benutzen:
Code: (dl )
1
2
3
4
5
6
7
8
$pid = fork;
die "Can't fork: $!" if !defined $pid;
if ($pid == 0) { # child
exec $^X, "endless.pl";
die "Exec failed: $!";
}
# parent
...
kölsch
 2004-03-30 11:54
#1624 #1624
User since
2003-10-02
66 Artikel
BenutzerIn
[default_avatar]
[quote=ptk,15.Mar..2004, 14:53]fork() musst du wie folgt benutzen:
Code: (dl )
1
2
3
4
5
6
7
8
$pid = fork;
die "Can't fork: $!" if !defined $pid;
if ($pid == 0) { # child
   exec $^X, "endless.pl";
   die "Exec failed: $!";
}
# parent
...
[/quote]
Damit wartet er immernoch auf den Rückgabewert (wundert mich auch).
Mit Win32::Process funktioniert das ganze. Er gibt also nur den Anstoß für endless.pl. Aber wieso?? Und wieso bei der fork Variante nicht?
ptk
 2004-03-30 12:36
#1625 #1625
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Hmmm. Beim Studium von perlfork.pod und perlport.pod hat keinen Hinweis zutage gebracht, dass exec() bei einem pseudo-fork nicht wie erwartet funktionieren sollte (ausser dass die Prozess-ID nicht die selbe wie die zu erwartende bei Unix ist). Vielleicht ein Bug in deiner Perl-Version?
kölsch
 2004-03-30 20:24
#1626 #1626
User since
2003-10-02
66 Artikel
BenutzerIn
[default_avatar]
[quote=ptk,30.Mar..2004, 10:36].. Vielleicht ein Bug in deiner Perl-Version?[/quote]
hab mir letztens erst VER5.8.3 installiert..
Hätt deine Lösung vll mal auf der 6er Version testen sollen. Kann das an der Version liegen? Eigentlich nicht möglich..
ptk
 2004-03-30 20:26
#1627 #1627
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Pseudo-Fork-Unterstuetzung sollte in 5.8.3 auf jeden Fall enthalten sein. Aber Bugs sind immer moeglich...
<< >> 8 Einträge, 1 Seite



View all threads created 2004-03-12 14:28.