public static IEnumerable<AnnotatedPacket> AnnotatePackets( int w, int h, IEnumerable<TtyRecPacket> packets, Func<bool> checkinterrupt ) { var term = new Terminal(w,h); var memory_budget3 = Configuration.Main.ChunksTargetMemoryMB * 1000 * 1000; var time_budget = TimeSpan.FromMilliseconds( Configuration.Main.ChunksTargetLoadMS ); var last_restart_position_time = DateTime.MinValue; var last_restart_memory_avail = memory_budget3/3; foreach ( var packet in packets ) { if ( checkinterrupt() ) break; var now = DateTime.Now; bool need_restart = (last_restart_position_time+time_budget < now) || (last_restart_memory_avail <= 1000) ; if ( packet.Payload == null ) { using ( term ) {} term = new Terminal(w,h); need_restart = true; } yield return new AnnotatedPacket() { SinceStart = packet.SinceStart , Payload = packet.Payload , RestartPosition = need_restart ? new Terminal(term) : null }; if ( need_restart ) { last_restart_position_time = now; last_restart_memory_avail = memory_budget3/3; } else { last_restart_memory_avail -= w*h*12; } if ( packet.Payload!=null ) term.Send( packet.Payload ); } using ( term ) {} }
/// <summary> /// Create a copy of an existing PuTTY terminal, including PuTTY's parse state /// </summary> /// <param name="toclone">The terminal to make a copy of</param> public Terminal( Terminal toclone ) { Handle = ClonePuttyTerminal( toclone.Handle ); Width = toclone.Width; Height = toclone.Height; }
/// <summary> /// Create a copy of an existing PuTTY terminal, including PuTTY's parse state /// </summary> /// <param name="toclone">The terminal to make a copy of</param> public Terminal(Terminal toclone) { Handle = ClonePuttyTerminal(toclone.Handle); Width = toclone.Width; Height = toclone.Height; }