Seite 1 von 1
Mehrere RUNs -> Insufficient memory to load program
Verfasst: Do, 03. Jul 2014 13:45
von komnick
Liebe Gemeinde,
ich habe ein Clipperprogramm - nennen wir es "Mutter" - das mittels RUN-Befehl nacheinander mehrere andere Clipper-Programme - nennen wir sie "Töchter" - aufruft. Unter DOS funktioniert das super, in der cmd-Box unter Windows XP und NT jedoch scheint die Anzahl der möglichen RUN-Aufrufe limitiert zu sein: Drei Töchter können gut aufgerufen werden, bei der vierten Tochter erhalte ich dann aber die Fehlermeldung:
DOS/16M error [6] Insufficient memory to load program
Soll heißen: Die vierte Tochter, und alle weiteren, lassen sich nicht mehr starten, die Mutter ist aber noch aktiv. Es sieht also danach aus, als würde bei Beendigung einer Tochter diese nicht allen Speicherplatz wieder freigeben. Wenn ich mir aber nach jedem Tochter-Aufruf den Speicherplatz (mittels MEM /C) anzeigen lasse, so erhalte ich nach jeder Tochter exakt dieselben Zahlen.
Hat jemand eine Idee, wie ich diesen Fehler verhindern kann?
Testprogrammcode:
Code: Alles auswählen
LOCAL counter := 0
LOCAL prgname := "TEST1" //Tochter-Testprogramm heißt TEST1.EXE
DO WHILE .T.
counter++
RUN (prgname) //Fehler bei counter=4
**SWPRUNCMD(prgname,0,"","") //Alternative, macht keinen Unterschied
IF ALERT(prgname+" "+LTRIM(str(counter,5)), {"WEITER", "ENDE"}) # 1
EXIT
ENDIF
RUN ("MEM /C") //Zeigt nach jedem Durchlauf die exakt gleichen Werte an...
inkey(0) //auf Tastendruck warten
ENDDO
Hier ein paar Details zum Problem:
- Das Problem tritt auf, egal welche Clipper-Exen ich als Töchter teste; die Anzahl der möglichen RUN-Aufrufe variiert dabei geringfügig.
- Das Problem tritt auch auf, wenn Mutter und Töchter simpelste Testprogramme sind, die sonst nichts tun.
- Das Problem tritt unabhängig davon auf, ob die Töchter mit RUN oder mit SWPRUNCMD() gestartet werden.
- Das Problem tritt unabhängig davon auf, ob die Mutter mit BLINKER oder EXOSPACE gelinkt wurde.
- Das Problem tritt sowohl auf, wenn die Töchter mit BLINKER, als auch wenn sie mit EXOSPACE gelinkt wurden; allerdings lassen BLINKER-Töchter deutlich mehr RUN-Aufrufe zu.
- Im Echteinsatz bin ich wegen eines anderen Problems gezwungen, EXOSPACE (und nicht BLINKER) zu verwenden.
- Beim Linken mit EXOSPACE wird OPTEDIT -EXTRAMIN 16384 -BUFFER 16384 -TSSIZE 512 [Dateiname].EXE benutzt.
- Clipperversion: 5.3
Ich bedanke mich vorab herzlich bei jedem, der zu meinem Problem etwas beisteuern kann.
Mit besten Grüßen
Martin Komnick
Re: Mehrere RUNs -> Insufficient memory to load program
Verfasst: Do, 03. Jul 2014 14:09
von georg
Hallo, Martin -
hast Du mal versucht, "cmd.exe" zu starten und das auszuführende Programm als Parameter zu übergeben?
Ich setze seit Jahren kein Clipper mehr ein, aber ich denke, ein Versuch, den Tochter-Prozess über cmd.exe zu starten, könnte zu einem neuen "DOS"-Fenster führen und damit die Last vom aktuellen Fenster nehmen. Einen Versuch wäre es mindestens wert.
Re: Mehrere RUNs -> Insufficient memory to load program
Verfasst: Do, 03. Jul 2014 14:34
von brandelh
das Programm kann nicht groß sein, sonst würde es unter DOS (mit Netzwerktreiber) nicht funktionieren
Wir haben nie RUN genutzt, weil es einfach zu viel Speicher verbraucht (außer für kurze Betriebssystem Aufrufe).
Ich hatte ein Menü-Programm, das über eine Batchdatei aufgerufen wurde.
Nach Auswahl des "Nachfolgers" wurden die nötigen BATCH Befehle in die offene Batchdatei geschrieben und das Programm beendet.
die Batchverarbeitung fuhr mit dem gewünschten Befehl fort und nach dem Ende wurde die Batch wieder neu gestartet ... zum Menü.
Das kann man auch mit errorlevel und QUIT( nErrorLevel) machen, dabei muss man nur beachten, dass die höchste errornummer am Anfang kommt.
Eventuell kann ich das alte Menü noch finden ... so als Anregung.
Die DOS Boxen unter Windows NT und XP haben grundsätzlich mehr freien Speicher für die DOS Anwendung als das Original selbst,
aber ich arbeite schon lange nicht mehr mit Clipper und RUN haben wir nur spärlich eingesetzt.
Re: Mehrere RUNs -> Insufficient memory to load program
Verfasst: Do, 03. Jul 2014 14:47
von komnick
Hallo Georg, hallo Hubert,
vielen Dank für eure Antworten.
Georg, ich habe deine Idee gerade getestet: Auch mit 'cmd' erhalte ich beim vierten RUN die Fehlermeldung. Getestet: RUN ("cmd /C test1").
Hubert, ja, dein altes Menü könnte für mich als Beispiel interessant sein. Allerdings handelt es sich bei den Programmen, um die es mir geht, um komplexere Anwendungen als ein Menü.
Gruß, Martin.
Re: Mehrere RUNs -> Insufficient memory to load program
Verfasst: Do, 03. Jul 2014 15:02
von brandelh
Was spielt das für eine Rolle ?
Solange es kein Problem darstellt, dass das bis jetzt aufrufende Programm tatsächlich geschlossen wird funktioniert es besser weil unnötiger Speicher freigegeben wird.
Wenn du aber mehrere Sachen gleichzeitig benötigst, dann geht es so natürlich nicht.
Hast du mal mit der Demo von Xbase++ getestet ob eine Umstellung möglich ist ?
Ein RUN aus einer Win32 EXE kennt die Begrenzungen so nicht !
Re: Mehrere RUNs -> Insufficient memory to load program
Verfasst: Do, 03. Jul 2014 15:07
von Herbert
...da alles Clipper-Programme sind, ruf die Tochterprogramme doch direkt aus dem Code auf. Also anstelle des RUN ... ganz einfach die Start-Rutine loslassen
Re: Mehrere RUNs -> Insufficient memory to load program
Verfasst: Do, 03. Jul 2014 15:56
von komnick
@Hubert: Ich habe hier ca. 200 Clipper-Exen. Nach meiner Erfahrung sollten die komplett oder gar nicht auf Xbase umgestellt werden, nicht nur "die Mütter". Ich möchte das Problem in Clipper lösen.
@Herbert: Ich verstehe nicht ganz, was du meinst. Direkt den Code aller Töchter verlinken? Die Töchter sind variabel. Alle möglichen Töchter in eine EXE zu linken ergäbe ein Monsterprogramm, das vermutlich alle Kapazitätsgrenzen sprengen würde.
@Georg: Ich glaube, du hast mich auf die richtige Spur gebracht. Ich experimentiere zur Zeit mit RUN ("cmd /C START ... "); hab's zwar noch nicht, aber sieht vielversprechend aus...
Re: Mehrere RUNs -> Insufficient memory to load program
Verfasst: Do, 03. Jul 2014 16:49
von Herbert
du hattest bisher nicht von so einer Grossfamilie gesprochen.
Was unterscheidet denn die vielen Exe's? Liesse sich das Ganze mit Parametern spielen?
Re: Mehrere RUNs -> Insufficient memory to load program
Verfasst: Do, 03. Jul 2014 17:12
von Koverhage
Normal müssten sich doch alle Programme mit Xbase++ kompilieren lassen und dann laufen.
Hätte den Vorteil das so gut wie keine Speicherbegrenzungen bestehen.
Re: Mehrere RUNs -> Insufficient memory to load program
Verfasst: Do, 03. Jul 2014 21:14
von AndreasL
Wie wärs damit: In der Mutter.exe erzeugst du Batchdateien, die das gewünschte Tochterprg aufruft. Parallel zur Mutter startest Du eine Mutter-Batch, die in einer Schleife prüft, ob neue Batchdateien vorliegen. Wenn ja, mit START xxx.bat starten.
Re: Mehrere RUNs -> Insufficient memory to load program
Verfasst: Fr, 04. Jul 2014 1:40
von AUGE_OHR
komnick hat geschrieben:Unter DOS funktioniert das super, in der cmd-Box unter Windows XP und NT jedoch scheint die Anzahl der möglichen RUN-Aufrufe limitiert zu sein:
Drei Töchter können gut aufgerufen werden, bei der vierten Tochter erhalte ich dann aber die Fehlermeldung:
DOS/16M error [6] Insufficient memory to load program
wie sieht deine CONFIG.SYS / Autoexec.BAT unter DOS aus ? (\HIMEM.SYS ??? / set DOS16M=??? )
was steht bei dir in C:\WINDOWS\system32\CONFIG.NT und AUTOEXEC.NT
unter Windows 32bit gibt es _Default.PIF. wenn du es so für Command.COM konfiguriert
- COMMAND_COM.JPG (38.53 KiB) 13655 mal betrachtet
solltest du genügend XMS / EMS haben.
Code: Alles auswählen
MailServer C:\>mem /c
Konventioneller Speicher:
Name Größe (dezimal) Größe (hex)
------------- --------------------- -------------
MSDOS 12096 ( 11.8K) 2F40
KBD 3296 ( 3.2K) CE0
HIMEM 1248 ( 1.2K) 4E0
COMMAND 4640 ( 4.5K) 1220
DOSX 34720 ( 33.9K) 87A0
KB16 6096 ( 6.0K) 17D0
Frei 112 ( 0.1K) 70
Frei 1456 ( 1.4K) 5B0
Frei 591472 (577.6K) 90670
Insgesamt frei: 593040 (579.1K)
Hoher Speicher:
Name Größe (dezimal) Größe (hex)
------------- --------------------- -------------
SYSTEM 196592 (192.0K) 2FFF0
DOSX 128 ( 0.1K) 80
MOUSE 12528 ( 12.2K) 30F0
MSCDEXNT 464 ( 0.5K) 1D0
REDIR 2672 ( 2.6K) A70
TAME-MON 18688 ( 18.3K) 4900 -> TAME
NW16 2512 ( 2.5K) 9D0 -> Novell
VWIPXSPX 496 ( 0.5K) 1F0 -> Novell
Frei 1440 ( 1.4K) 5A0
Frei 1472 ( 1.4K) 5C0
Frei 24944 ( 24.4K) 6170
Insgesamt frei: 27856 ( 27.2K)
Insgesamt frei (konventioneller und hoher Speicher): 620896 (606.3K)
Maximale Größe für ausführbares Programm: 591472 (577.6K)
Größter freier Block im hohen Speicherblock: 24944 ( 24.4K)
15728640 Bytes gesamter fortlaufender Erweiterungsspeicher
1048576 Bytes fortlaufender Erweiterungsspeicher verfügbar
15580160 Bytes XMS-Speicher verfügbar
MS-DOS ist resident im oberen Speicherbereich (HMA).
MailServer C:\>
komnick hat geschrieben:Clipperversion: 5.3
Wenn du die PRG mit EXOSPACE linkst dann benötigst du EMS
wenn du Blinker von V5.3 benutzt dann macht er nur REAL-Mode EXE
wenn du einen Blinker > v1.0 hast könntest du die Schalter
Code: Alles auswählen
swpuseems(.t. / .f.)
swpusexms(.t. / .f.)
swpuseumb(.t. / .f.)
benutzen wobei man mit 256 KB "free Memory" noch Cl*pper Progranme zum laufen bekommt.
Re: Mehrere RUNs -> Insufficient memory to load program
Verfasst: Fr, 04. Jul 2014 6:50
von Herbert
Wow, Jimmy, was du alles noch weisst. Ich erinnere mich an Zeiten vor der Jahrtausendwende, als ich exospace (übrigens mit gutem Erfolg) einsetzte. Compilieren auf langsamen 386-er...
Aber dein Ansatz ist wichtig. Die config.nt muss entsprechende Aufrufe aufweisen, ähnlich der Config.sys. Dazu die passenden set-Befehle, welche aber auch in die .cmd oder .bat hinein gebaut werden können.
Aber ich frage mich schon, warum du so viele verschiedene .exe einsetzen musst.
Re: Mehrere RUNs -> Insufficient memory to load program
Verfasst: Fr, 04. Jul 2014 7:08
von brandelh
komnick hat geschrieben:@Hubert: Ich habe hier ca. 200 Clipper-Exen. Nach meiner Erfahrung sollten die komplett oder gar nicht auf Xbase umgestellt werden, nicht nur "die Mütter".
ich meinte selbstverständlich eine Komplettumstellung aller Programme
komnick hat geschrieben:Ich möchte das Problem in Clipper lösen.
Mutig
Du schreibst von XP und NT ... hast du es mal mit Win 7 versucht ?
Oder das DOS Subsystem austauschen: DOSBOX könnte sich besser verhalten.
Mit Clipper 5.3 habe ich keine Erfahrungen. Ich blieb bei 5.2e.
Wird nach einem "Tochterprogramm" eigentlich immer dieses beendet und zur Mutter zurückgesprungen ?
Wenn ja könnte man es so machen:
ProgWahl.bat
Code: Alles auswählen
@echo off
:ProgStart
cls
Mutter.exe
REM Batchdateien interpretieren == als >= !
if errorlevel==201 goto ProgStart
if errorlevel==199 goto Prog199
...
if errorlevel==1 goto Prog001
goto Ende
:Prog199
Tochter199.exe
...
goto ProgStart / Prog... // was nötig ist
...
:Prog001
Tochter001.exe
...
goto ProgStart / Prog... // was nötig ist
:ende
in der Steuer PRG (eventuell auch in anderen, aber dann wird die bat sehr unübersichtlich)
Code: Alles auswählen
...
nProgAuswahl := 0 bis 200 je nach Wunsch
If empty(nProgAuswahl)
quit
else
quit nProgAuswahl
endif
Re: Mehrere RUNs -> Insufficient memory to load program
Verfasst: Fr, 04. Jul 2014 12:21
von komnick
Ich danke euch allen vielmals für eure Hilfe.
Ich habe mein Problem dank Georgs Tip gelöst, indem ich RUN (prgname) durch myRUN(prgname) ersetzt habe, das etwa so aussieht:
Code: Alles auswählen
PROCEDURE myRUN(prgname)
MEMVAR Programm_laeuft_unter_DOS
IF Programm_laeuft_unter_DOS
RUN (prgname)
ELSE
Zeige_im_Mutterfenster_was_passiert()
**
RUN ("CMD /C START /WAIT "+prgname) //lässt prgname im eigenen Fenster ablaufen
**
Zeige_im_Mutterfenster_was_passiert_entfernen()
ENDIF
Ihr seid super!
Martin