| |
|
|
Clemens Meier | Ich bin derzeit an einer Internetanwendung dran, bei der bestimmte Teile auch base64 kodiert/dekodiert werden müssen. Das Kodieren braucht immer seine Zeit, besonders bei großen Dateien. Also möchte ich diese Kodierung im Hintergrund laufen lassen, so dass das Hauptprogramm ohne Problem weiterlaufen kann. Daher will ich gerne einen Hintergrundprozess starten.
Folgendes Szenarium: Ich habe eine haupt.exe , ein mit XProfan compiliertes Stück Programm Dann habe ich eine base64.prc . Die Kommunikation zwischen beiden soll via pipe.pcu stattfinden. Beim Beenden von haupt.exe soll auch der Hintergrundprozess beendet werden (nicht dass das Ding als Leiche im Speicher bleibt).
Soviel ich weiß, kann ich das base64.prc als Parameter von haupt.exe starten. Und da ich kein Fenster generiere, erscheint es auch nirgendwo, höchstens im Taskmanager als Prozess. Richtig? Starte ich es am Besten mit WinExec ... ? Da bekomme ich ein Handle zurück und könnte mit Destroy(&handle) den Prozess wieder stoppen. Auch richtig?
Ich habe hier im Forum aber auch andere Möglichkeiten gefunden. Allerdings wurde dort nur jeweils eine .exe gestartet, immer ohne Parameter. Dann wurde in einem anderen Thread erwähnt, dass es unter Win9X das Aufrufen mehrere Profanprogramme gleichzeitig zu Abstürzen führt. Leider wurde die Diskussion dort nicht zu Ende geführt, so dass ich nicht weiß, ob es dafür einen Workaround gibt.
Und letztes: vermutlich wird die base64.prc nicht der einzige Prozess bleiben. Gäbe es Probleme, wenn es mehrere werden?
Gruß |
|
|
| |
|
|
|
| Hm hier habs mal zusammengepinselt, das sollte für eine erste Orientierung ausreichen: KompilierenMarkierenSeparieren {$cleq}
def $apptitle ClemensVorlage
cls
$U pipe.pcu = pipe.
$U thread.pcu = thread.
declare pipe&
if %parcount
encode
else
declare ex&
app
endif
pipe.close pipe&
end
proc app
print app
case pipe.is(myClemensPipe) : error Pipe already exists, abort.
pipe&:=pipe.create(myClemensPipe)
declare fle$
fle$:=dfokk.bmp
casenot fileexists(fle$) : error File +fle$+ doesnt exist, abort.
pipe.push pipe&,>+fle$
shell par$(0)+ -
thread.start 1,3
usermessages 1
whilenot ex&
waitinput
wend
thread.stop 1
print Tjoar fertig :P [taste]
waitkey
endproc
proc encode
print encoder
casenot pipe.is(myClemensPipe) : error Pipe doesnt exists, abort.
pipe&:=pipe.create(myClemensPipe)
declare fle$
fle$:=del$(pipe.pop(pipe&),1,1)
casenot fileexists(fle$) : error File +fle$+ doesnt exist, abort.
declare mem#,siz&
siz&:=filesize(fle$)
casenot siz& : error File +fle$+ is without content.
print File: +fle$
dim mem#,siz&
blockread(fle$,mem#,0,siz&)
declare i&,s$,c&
for i&:=0 to siz& do begin
c&+
s$:=s$+.hexx(byte(mem#,i&))
if c&>=512
c&:=0
pipe.push pipe&,<+s$
s$:=
endif
end
case len(s$) : pipe.push pipe&,<+s$
pipe.push pipe&,.//bye
proc .hexx
parameters b&
case b&<16 : return 0+hex$(b&)
return hex$(b&)
endproc
endproc
proc thread.do
parameters n&
declare s$
s$:=mid$(pipe.get(pipe&),1,1)
if n&==1
if (s$==<)
print pipe.pop(pipe&)
elseif (s$==.)
print done.
ex&+
sendmessage(%hwnd,1,0,0)
endif
endif
endproc
proc error
parameters s$
messagebox s$,$apptitle,0
end
endproc
Das Demo zeigt auch, das Du sehrwohl auch mehere Prozesse beauftragen kannst, Du Dir dann aber auch ein eigenes Protokoll schaffen musst um die Inputs zu koordinieren. |
|
|
| |
|
|
|
Clemens Meier | Das mit der Pipe ist mir klar und eine Threadid ist für das Protokol mit den eigenständigen Prozessen reserviert. Diese Prozesse sollen permanent im Hintergrund laufen. Via Pipe und ein Handle pro Prozess verläuft die Kommunikation. Doch wie steht es mit den Prozessen selbst. Gibt es Probleme, wenn ich den Prozess wie oben angegeben aufrufe, also mehrere Profaninstanzen im Speicher habe.
Oder soll ich eher auf einen Aufruf wie unter [...] bauen? Da wird aber nur eine exe aufgerufen. Ich will aber nicht verschiedene exe anbieten, sondern möglichst als umbenannte prc-Dateien,
Also: mein Hauptprogramm heißt programm.exe In diesem Programm werden zwei Prozesse gestartet das eine hieß prozess1.prc und wurde zuvor umbenannt zu p1.ttt. Dieses soll mit programm.exe p1.ttt gestartet werden das zweite hieß prozess2.prc und wurde zuvor umbenannt zu p2.ttt. Dieses soll dann mit programm.exe p2.ttt gestartet werden. Beide Prozesse haben kein eigenes Fenster, es gibt also auch keine Fehlermeldungen oder Messages. Alles wird via Protokol an das Hauptprogramm gemeldet, so dass dieses darauf reagieren kann, wenn nötig.
Gäbe es damit Probleme? Welches Verfahren ist für den Aufruf der PRC-Dateien zu empfehlen? Ich hoffe, mein Problem ist jetzt klar geworden (trotzdem danke iF) |
|
|
| |
|
|
|
|
Gibt es Probleme, wenn ich den Prozess wie oben angegeben aufrufe, also mehrere Profaninstanzen im Speicher habe.
Pauschal nein.
Gäbe es damit Probleme?
Pauschal nein.
Oder soll ich eher auf einen Aufruf wie unter...
Steht Dir frei.
Welches Verfahren ist für den Aufruf der PRC-Dateien zu empfehlen?
Siehe Source.
PS: Es ist unwichtig wie Deine Exen heissen, und wieviele exen (oder prcs) Du erstellst, und wieviele Prozesse laufen. Mein Source oben demonstriert: Eine Exe, Zwei Prozesse, Ein Source. |
|
|
| |
|
|
|
Clemens Meier | Mein Problem war wohl, dass ich das Thread [...] gelesen habe (System oder Programmabsturz, wenn mehrere Profanprogramme laufen). Aber wenn Du mir jetzt erklärst, dass es da absolut keine Probleme gibt, egal welche Methode ich verwende, dann werde ich dir das erst einmal glauben. Aber wehe, irgendein win95 / 98 User reißt mir den Kopf ab, dann besuche ich dich |
|
|
| |
|
|