2021-03-18 18:01:48 +00:00
|
|
|
using System;
|
2021-03-18 20:04:37 +00:00
|
|
|
using System.IO;
|
2021-03-18 18:01:48 +00:00
|
|
|
using System.Threading;
|
|
|
|
using Gdk;
|
|
|
|
using Gtk;
|
|
|
|
|
|
|
|
namespace Samples
|
|
|
|
{
|
|
|
|
|
|
|
|
[Section (ContentType = typeof(PixbufDemo), Category = Category.Miscellaneous)]
|
|
|
|
class PixbufSection : ListSection
|
|
|
|
{
|
|
|
|
|
|
|
|
public PixbufSection ()
|
|
|
|
{
|
|
|
|
AddItem ($"Press button to run / stop {nameof(PixbufDemo)} :", new PixbufDemo ("Press me"));
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
class PixbufDemo : Button
|
|
|
|
{
|
|
|
|
|
|
|
|
public PixbufDemo (string text) : base (text) { }
|
|
|
|
|
|
|
|
private bool running = false;
|
|
|
|
|
|
|
|
public void DispatchPendingEvents ()
|
|
|
|
{
|
|
|
|
// The loop is limited to 1000 iterations as a workaround for an issue that some users
|
|
|
|
// have experienced. Sometimes EventsPending starts return 'true' for all iterations,
|
|
|
|
// causing the loop to never end.
|
|
|
|
|
|
|
|
int n = 1000;
|
|
|
|
Gdk.Threads.Enter ();
|
|
|
|
|
|
|
|
while (Gtk.Application.EventsPending () && --n > 0) {
|
|
|
|
Gtk.Application.RunIteration (false);
|
|
|
|
}
|
|
|
|
|
|
|
|
Gdk.Threads.Leave ();
|
|
|
|
}
|
|
|
|
|
|
|
|
protected override void OnPressed ()
|
|
|
|
{
|
|
|
|
base.OnPressed ();
|
|
|
|
var count = 0;
|
|
|
|
|
|
|
|
if (running) {
|
|
|
|
running = false;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var startmem = GC.GetTotalMemory (true);
|
|
|
|
var testfile = "Textpic.png";
|
|
|
|
|
2021-03-18 20:04:37 +00:00
|
|
|
using var teststream = typeof(ImageSection).Assembly.GetManifestResourceStream("Testpic");
|
|
|
|
using (var writeTestFile = new FileStream(testfile, FileMode.Create)) {
|
|
|
|
teststream.CopyTo(writeTestFile);
|
2021-03-18 18:01:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
using (var heatup = new Pixbuf (testfile)) {
|
|
|
|
ApplicationOutput.WriteLine ($"{nameof(heatup)}.{nameof(Pixbuf.ByteLength)}\t{heatup.ByteLength:N0}");
|
|
|
|
}
|
|
|
|
|
|
|
|
startmem = GC.GetTotalMemory (true);
|
|
|
|
ApplicationOutput.WriteLine ($"{nameof(GC.GetTotalMemory)} at start: {startmem:N}");
|
|
|
|
running = true;
|
|
|
|
|
|
|
|
var memAllocated = 0UL;
|
|
|
|
|
|
|
|
while (running) {
|
|
|
|
|
|
|
|
using (var source = new Pixbuf (typeof(ImageSection).Assembly, "Testpic")) {
|
|
|
|
memAllocated += source.ByteLength;
|
|
|
|
count++;
|
|
|
|
}
|
|
|
|
|
|
|
|
DispatchPendingEvents ();
|
|
|
|
|
|
|
|
if (!running)
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
var endmem = GC.GetTotalMemory (true);
|
|
|
|
ApplicationOutput.WriteLine ($"Leak:\t{(endmem - startmem):N0}\t{nameof(memAllocated)}");
|
|
|
|
ApplicationOutput.WriteLine ($"{nameof(GC.GetTotalMemory)} at start: {startmem:N0}\tat end: {endmem:N0}\t{nameof(Pixbuf)} created: {count}");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|