output buffer to small for block

Hallo Torben,

ich steuere seit neustem eine Serielle Schnittstelle an mit einem mAirList Script (Sendeampel). Doch nach einiger Zeit (ca nach 30 min.) kommt diese Fehlermeldung: output buffer to small for block. Dann muss ich das Programm schließen und wieder öffnen, und alles funktioniert wieder. Aber auch nur ca eine halbe Stunde. Und Mairlist beenden bei laufender Sendung ist nicht so ganz nice xD Wie könnte ich diesen Fehler beheben? Zudem kommt manchmal die Fehlermeldung, manchmal hängt sich aber auch nur das Script auf…?!?

Grüße, Felix

Sinngemäß bedeutet die Meldung, dass du zu viele Daten auf einmal schickst? Kann das sein?

Kann sein. Ich denke dass in mAirList mit der Zeit immer mehr und mehr Speicher reserviert oder mehr Speicher gebraucht wird und irgendwann gibt es keinen Speicher mehr. Dann kommt der Fehler und er kann mit der Schnittstelle nicht mehr kommunizieren. Wenn ich das Programm neu starte, geht alles wieder. Aber im Script ist doch nichts falsch oder? :o

var levelInfo: ILevelInfo;

procedure OnLoad;
begin
SystemLog(‘Sendeampel bereit’);
levelInfo := Encoder.GetMixerLevelInfo(smMaster);
EnableTimer(500);
end;

procedure OnUnload;
begin
DisableTimer();
end;

procedure OnTimer;
var
levels: TLevelArray;
l, r: Double;
begin
if levelinfo.GetLevels(levels) then begin
l := levels[0];

	if(l > 0.9) then begin
		ComPort('COM3').SendStr('PEAK;')
	end
	else begin
		ComPort('COM3').SendStr('NO_PEAK;')
	end;

end;
end;

procedure OnPlayerEOFWarning(PlaylistIndex: integer; PlayerIndex: integer);
begin
ComPort(‘COM3’).SendStr(‘EOF;’);
end;

procedure OnPlayerStateChange(PlaylistIndex: integer; PlayerIndex: integer; OldState: TPlayerState; NewState: TPlayerState; Item: IPlaylistItem);
begin
if NewState = psEmpty then begin
ComPort(‘COM3’).SendStr(‘NO_EOF;’);
end;
end;

begin
end.

Man könnte das Script sicher noch optimieren, zum Beispiel, indem es sich den letzten Zustand PEAK oder NO_PEAK merkt und nicht alle 500ms neu schickt, wenn es sich nicht geändert hat.

ABER:

Du sagst, der Speicherverbrauch steigt? Also die Anzeige im Task-Manager?

Nein. Nicht im Task Manager. War nur eine Vermutung von mir. Kann ja sein dass mairlist für die scripts gewisse Speicher hat und diese dann voll sind da zu viele Infos rüberfließen.

Die Meldung kommt definitiv von der Library, die die serielle Schnittstelle ansteuert.

Auf was hast du denn den Puffer stehen in der Konfiguration? Standard sind ja 4096. Vielleicht mal vergrößern?

Leider kein Erfolg… auch wenn er sich den Zustand merkt…

Zunächst: Es hat sich herausgestellt, dass die Puffer-Einstellungen nicht richtig verarbeitet wurden. Das ist im Snapshot 3225 behoben. Dort kann man nun also wirklich den Puffer hochstellen.

Mich wundert aber noch immer, dass er angeblich vollläuft. Entweder schickt das Script doch noch zu schnell zu viele Befehle. Oder sie werden irgendwie von der Gegenseite nicht richtig abgeholt?

Vielleicht kannst du ja testweise noch SystemLog-Befehle dort im Script einfügen, wo Daten gesendet werden, damit man nachvollziehen kann, wieviel das Script wirklich sendet.

Hey Torben,

danke für deine Ratschläge. Aber leider immernoch kein Erfolg! Es wird wirklich nur ca. jede Minute geschickt. Früher dauerte es ja ca eine halbe Stunde bis sich das System aufhang, aber nun dauert das was vorher 30 min gedauert hat, 3 Minuten! (neusten Snapshot vorhanden)

Und wie ist das Verhalten der Ampel? Funktioniert sie exakt ab dem Zeitpunkt, wo die Meldung kommt, nicht mehr? Oder schon vorher?

Sie funktioniert ab dem Zeitpunkt, wo die Meldung kommt nicht mehr und hängt sich auf. Sie führt Quasi den zuletzt bekommenen Befehl aus. War der letzte Befehl EOF, blinkt sie unendlich.

Ok, dann forschen wir mal weiter nach… Der Fehler wird tief in einer Library erzeugt, die nicht von mir stammt. Daher kann ich über die genauen Umstände auch nur spekulieren. Offenbar tritt es aber dann auf, wenn sich zu viele Daten im Puffer gesammelt haben, die der Port bzw. seine Gegenstelle nicht rechtzeitig abgeholt haben.

Nimm doch mal bitte die Debug-Version von hier:

https://www.dropbox.com/sh/8kuo7s351h05jfh/AABwDm2Q-iKjSW0BKwyW3-_ea?dl=0

Die öffnet ein zusätzliches Protokollfenster, wo die Aktionen mitgeschrieben werden. Die Ausgabe landet auch in der Datei debug-<Datum/Uhrzeit>.txt im mAirList-Datenordner. Die Datei würde ich gerne mal sehen.

Bei deiner Version führt er das Script garnicht erst aus. Mittlerweile habe ich aber in meinem Mairlist diese Fehlermeldung bekommen. Danach hat sich die Ampel aufgehängt. Kann es sein dass die Meldung mit der Ampel in Verbindung steht? http://prntscr.com/e9lgqs Ich hab auch die Bugreport Detail Liste von der Meldung da, wenn du die brauchst.

Ja, schick doch mal rüber, gerne per Mail - info@mairlist.com.

Gemacht!