Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » WinExec() und Speicher

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
31.05.2005, 07:32 Uhr
Bundy



Ich habe folgendes Problem:

Mein Programm führt über WinExec mehrmals hintereinander (einige 1000 mal) eine externe Anwendung aus, die sich nach einiger Zeit selbst beendet:


C++:
MessageBox(NULL, "Schau mal wieviel freien Speicher Du hast","",MB_OK)
HWND externApp;
for (int i=0; i<2000; i++)
{
   externApp=WinExec("app.exe",SW_SHOW);
  
   //Die folgende Zeile der Einfachheit nur in Pseudo:
   warte bis GetModuleUsage(externApp)==0 --> Anwendung beendet
}
MessageBox(NULL, "Schau mal wieviel Speicher Du jetzt noch hast","",MB_OK)




Der Speicher verringert sich bei mir zusehens, auch wenn die aufgerufene Anwendung nur für einen bestimmten Zeitraum ein Infofenster zeigt und sonst kein Speicher reserviert wird, der freigegeben werden müsste.
Hat jemand eine Ahnung woran das liegen könnte?

PS:
Ich arbeite in folgender Umgebung:

Windows 3.11
Borland C++ 4.5
32 MB RAM

Dieser Post wurde am 31.05.2005 um 09:43 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
31.05.2005, 08:27 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


das liegt an der Speicherverwaltung von Windows. Der speicher wird alloziiert, und auch freigegeben, aber nicht mit 0-en überschrieben, wodurch dieser bei der Anzeige als "belegt" gilt, aber von anwendungen wieder neu verwendet werden kann.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
31.05.2005, 09:37 Uhr
Bundy



Ja so sollte das eigentlich sein und ich hätte auch kein Problem damit, nur leider scheint sich nach der sequentiellen Ausführung der Anwendung der Speicher soweit aufzubrauchen, dass sich die Anwendung nach einiger Zeit nicht mehr ausführen lässt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
31.05.2005, 09:44 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


kann natürlich sein das WinExec irgendwelchen Speicher nicht wieder freigibt. probier mal ShellExecute zu verwenden, oder geht das mit Win3.11 noch nicht?


Bearbeitung:

mist ShellExecute ist mind Win95


--
class God : public ChuckNorris { };

Dieser Post wurde am 31.05.2005 um 09:45 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
31.05.2005, 09:54 Uhr
Bundy



Naja gibt's schon. Nur bin mir noch nicht ganz sicher ob ich damit mitbekomme, wann die Anwendung geschlossen wird - aber ich probier's mal.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
31.05.2005, 12:05 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


du kriegst ja mit ShellExecuteEx ein Process-Handle, das kannst du mit GetExitCodeProcess nach nem Exitcode abfragen... oder du benutzt gleich CreateProcess...
--
class God : public ChuckNorris { };

Dieser Post wurde am 31.05.2005 um 12:05 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
31.05.2005, 12:55 Uhr
Bundy



Mit ShellExecute() passiert das Gleiche: der Speicher frißt sich mit der Zeit voll.
Alternativ hab ich noch LoadModule + FreeModule probiert - ohne Erfolg.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
31.05.2005, 14:07 Uhr
Bundy



ShellExecuteEx() und CreateProcess() sind leider erst in der Win32API verfügbar. Trotzdem vielen Dank für den Tipp.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.06.2005, 09:22 Uhr
ao

(Operator)


Eigentlich sollte ja ein Betriebssystem im eigenen Interesse nach jeder beendeten Applikation aufräumen und eventuelle Leichen beseitigen. Aber bei den ganz alten DOS- und Windows-Versionen würde ich mich darauf nicht verlassen.

Krieg doch mal raus, ob es tatsächlich Windows ist, was den Speicher verliert, oder ob es die externe Anwendung ist, und Windows merkt das bloß nicht. Ersetz die Applikation durch ein Minimal-Programm, was nichts tut, also auch keinen Speicher verbraucht, und wiederhole den Test.

Wenn das Problem dann weg ist, ist es ein Bug in der Applikation. Wenn nicht, ist es ein Bug in Windows 3.11 oder in DOS.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
01.06.2005, 10:26 Uhr
Bundy



Genau das hab ich heute Morgen ausprobiert. Also es liegt scheinbar nicht wirklich an WinExec. Speicher geht nur dann verloren, wenn die Anwendung ein Fenster öffnet Beispielsweise, wenn es sich bei der Anwendung um ein DOS-Programm handelt und bei dessen Ausführung ein Shell-Fenster geöffnet wird.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: