Support Request #952
closedTrying to increase stack size for a selected filters
Description
Supportanfrage
Wenn ich mich richtig erinnere, wurde beim Übergang von 2.9.0 auf 2.9.1 die Stack-Größe auf einen kleineren Wert eingestellt. Das hat bei einigen unserer Filter (z. B. dem Framegrabber-Filter) zu Problemen geführt, weil dort ganze Bilder auf dem Stack abgelegt wurden (ob das sinnvoll ist oder nicht sei dahingestellt). Mit der kleineren Stackgröße reichte der Speicher nicht mehr aus. Das gleiche Problem ist nun an anderen Stellen bei Filtern aus unserer SIL-Umgebung aufgetaucht, die gerade von ADTF 2.9.0 auf 2.13 portiert wird.
Ich war der Meinung man kann in Visual Studio die Stack-Größe für jeden Filter individuell einstellen. Die Kollegen haben mir nun zurückgemeldet, dass man das zwar kann, es aber keine Auswirkung hat (die Stack-Größe wird vom ADTF-Framework übernommen?).
Eine Lösung für das Problem ist die Filter - wie unseren Framegrabber-Filter - umzuschreiben und die Daten statt auf dem Stack auf dem Heap abzulegen.
Es kam nun die Frage auf, ob es auch eine Lösung ohne Code-Änderung gibt. Die ursprüngliche Anfrage nach einem ADTF 2.13 wieder mit größerer Stack-Size habe ich bereits verneint.
Habt Ihr noch eine andere Idee oder einen Weg einzelnen Filtern einen größeren Stack zu spendieren?
Lösung
Das Compiler Flag /STACK:[0-9] ist der Wert, der per Default verwendet werden soll, wenn man einen Thread erzeugt.
D.h. man weist nicht einem Filter Speicher zu, sondern den CreateThread aufrufen unter Windows. Daher kann das auch nicht hochgesetzt werden für alle.
Wenn man synchron in einem OnPinEvent arbeitet, dann arbeitet in Caller Kontext, der den Stack für diesen Thread erzeugt hat.
D.h. die Stackgröße für einen Thread kann man nur verändern durch folgende Möglichkeiten:
1. Das OnPinEvent darf nicht synchron, sondern muss asynchron in einem eigenen thread verarbeitet werden:
2. a) Dabei muss man einen ::CreateThread Aufruf selber implementieren (siehe https://msdn.microsoft.com/en-us/library/windows/desktop/ms682453(v=vs.85).aspx) dort kann man die Stackgröße angeben
2. b) Ein a_utils::cThread verwenden und die Compileroption /Stack:<mysize> verwenden.
Files