Moin.
Noch etwas zum "Speicherfresser" - Das Problem mit dem Timer war eins, und hier ist noch eins, ich verstehe es noch nicht ganz, vielleicht finde ich hier Hilfe...
Das kleine Programm unten startet in einer Schleife 500 Threads (function) und wartet dann 5 Sekunden, in diser Zeit haben sich alle Threads wieder beendet. Die Threads machen nichts weiter als eine Ausgabe. Der Anstieg des Speicherverbrauchs hängt z.B. von der Länge des ausgegebenen Strings ab, je länger der String, um so schneller der Anstieg.
Kommentiere ich nun ExitThread(0) aus, dann bleibt der Speicherverbrauch konstant. Warum? Laut WinAPI wird der ThreadStack beim Aufruf von ExitThread wieder freigegeben:
"ExitThread is the preferred method of exiting a thread. When this function is called (either explicitly or by returning from a thread procedure), the current thread's stack is deallocated and the thread terminates. The entry-point function of all attached dynamic-link libraries (DLLs) is invoked with a value indicating that the thread is detaching from the DLL."
Darf ich ExitThread nicht in einer Funktion aufrufen? Zugegeben: ExitThread ist einer Funktion irgendwie doppelt gemoppelt: den Rückgabewert setzte ich mit result, ExitThread tut dies auch noch. Starte ich den Thread als Prozedur, ist der Speicherverbrauch konstant, hier macht ExitThread auch Sinn, so kann ich auch einen Wert zurückgeben, den ich mit GetExitCodeThread abfragen könnte.
Also: Warum frisst ein Thread, der als Funktion gestartet wurde und der mit der "preferred method" ExitThread beendet wurde, Speicher?
Ein etwas verwirrter Gruß an die Spezialisten von
Frank
P.S. ich werde die Frage wohl auch noch in einem Delphi-Forum stellen...
program Thread;
{$APPTYPE CONSOLE}
uses windows, sysutils;
//*******************************************************************
// myThreadProcedure
//*******************************************************************
function myThread(p: Pointer); stdcall;
begin
write(' ' + intToStr(Random(1000)));
ExitThread(0);
end;
//*******************************************************************
// myThreadFunction
//*******************************************************************
function myThread(p: Pointer): DWORD; stdcall;
begin
write(' ' + intToStr(Random(1000)));
result := 0;
ExitThread(0);
end;
//*******************************************************************
// main
//*******************************************************************
var
tId:DWORD;
i:integer = 0;
begin
while (TRUE) do begin
CreateThread(nil, 0, @myThreadFunction, nil, 0, tId);
// CreateThread(nil, 0, @myThreadProcedure, nil, 0, tId);
inc(i);
if i > 500 then begin
write(#10#13 + '**********Pause*************' + #10#13);
sleep(5000);
i:=0;
end;
end;
end.