Mehrere RUNs -> Insufficient memory to load program

Still in use?

Moderator: Moderatoren

Antworten
Benutzeravatar
komnick
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 37
Registriert: Mi, 04. Jun 2014 9:56
Wohnort: Berlin

Mehrere RUNs -> Insufficient memory to load program

Beitrag von komnick » Do, 03. Jul 2014 13:45

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

georg
Foren-Administrator
Foren-Administrator
Beiträge: 2200
Registriert: Fr, 08. Feb 2008 21:29

Re: Mehrere RUNs -> Insufficient memory to load program

Beitrag von georg » Do, 03. Jul 2014 14:09

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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14547
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Mehrere RUNs -> Insufficient memory to load program

Beitrag von brandelh » Do, 03. Jul 2014 14:34

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.
Gruß
Hubert

Benutzeravatar
komnick
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 37
Registriert: Mi, 04. Jun 2014 9:56
Wohnort: Berlin

Re: Mehrere RUNs -> Insufficient memory to load program

Beitrag von komnick » Do, 03. Jul 2014 14:47

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.

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14547
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Mehrere RUNs -> Insufficient memory to load program

Beitrag von brandelh » Do, 03. Jul 2014 15:02

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 !
Gruß
Hubert

Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1909
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Kontaktdaten:

Re: Mehrere RUNs -> Insufficient memory to load program

Beitrag von Herbert » Do, 03. Jul 2014 15:07

...da alles Clipper-Programme sind, ruf die Tochterprogramme doch direkt aus dem Code auf. Also anstelle des RUN ... ganz einfach die Start-Rutine loslassen
Grüsse Herbert
Immer in Bewegung...

Benutzeravatar
komnick
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 37
Registriert: Mi, 04. Jun 2014 9:56
Wohnort: Berlin

Re: Mehrere RUNs -> Insufficient memory to load program

Beitrag von komnick » Do, 03. Jul 2014 15:56

@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...

Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1909
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Kontaktdaten:

Re: Mehrere RUNs -> Insufficient memory to load program

Beitrag von Herbert » Do, 03. Jul 2014 16:49

:oops: du hattest bisher nicht von so einer Grossfamilie gesprochen.
Was unterscheidet denn die vielen Exe's? Liesse sich das Ganze mit Parametern spielen?
Grüsse Herbert
Immer in Bewegung...

Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2081
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Kontaktdaten:

Re: Mehrere RUNs -> Insufficient memory to load program

Beitrag von Koverhage » Do, 03. Jul 2014 17:12

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.
Gruß
Klaus

AndreasL
Rookie
Rookie
Beiträge: 4
Registriert: Sa, 02. Feb 2008 12:55
Wohnort: Bielefeld

Re: Mehrere RUNs -> Insufficient memory to load program

Beitrag von AndreasL » Do, 03. Jul 2014 21:14

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.
Andreas

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11421
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Mehrere RUNs -> Insufficient memory to load program

Beitrag von AUGE_OHR » Fr, 04. Jul 2014 1:40

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
COMMAND_COM.JPG (38.53 KiB) 3401 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.
gruss by OHR
Jimmy

Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1909
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Kontaktdaten:

Re: Mehrere RUNs -> Insufficient memory to load program

Beitrag von Herbert » Fr, 04. Jul 2014 6:50

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.
Grüsse Herbert
Immer in Bewegung...

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14547
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Mehrere RUNs -> Insufficient memory to load program

Beitrag von brandelh » Fr, 04. Jul 2014 7:08

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
Gruß
Hubert

Benutzeravatar
komnick
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 37
Registriert: Mi, 04. Jun 2014 9:56
Wohnort: Berlin

Re: Mehrere RUNs -> Insufficient memory to load program

Beitrag von komnick » Fr, 04. Jul 2014 12:21

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! :hello1:
Martin

Antworten