窗口/应用程序在循环中自发关闭/崩溃(?)(MonoDevelop Gtk#2.0应用程序)

时间:2017-06-10 05:22:00

标签: c# monodevelop ubuntu-16.04 gtk#

我受this article on "worst volume slider designs"的启发,创造了类似的东西。我的小项目似乎最初运行良好,但在进入while循环(见下文)后经过可变的秒数(通常在十几个左右)之后,应用程序只是关闭或崩溃(我' m不确定哪个)。这是我第一次使用MonoDevelop和Gtk#,虽然我对C#有一定的了解。我在Ubuntu 16.04上。

我的MainWindow.cs位于下方,所有其他表单都是使用Gtk# 2.0 Project模板自动生成的。最后,我的Window设计只有4个组件:一个固定容器,一个名为selectVolumeToggleButton的切换按钮,以及两个名为lVolumeLabelrVolumeLabel的标签。

没有报告任何错误或警告,我唯一的指示是关闭的是Build()有时(但并不总是)用消息加下划线"构造函数中的虚拟成员调用" 。 (谷歌搜索这没有帮助。)

我认为startIndex可能会变得太大(?),但将startIndex++替换为startIndex = (startIndex + 1) % pi.Length则无效。 (这似乎也不太可能,因为崩溃的时间与sleepTime无关。)

更新:当应用程序"崩溃时,未达到if右括号上的断点。

using System;
using System.Threading.Tasks;
using Gtk;

public partial class MainWindow : Gtk.Window
{
    public MainWindow() : base(Gtk.WindowType.Toplevel)
    {
        Build();
    }

    protected void OnDeleteEvent(object sender, DeleteEventArgs a)
    {
        Application.Quit();
        a.RetVal = true;
    }

    const string pi = "3.14159265358979323846264338327950288419716939937510"+
                        "58209749445923078164062862089986280348253421170679"+
                        "82148086513282306647093844609550582231725359408128";
    const int displayLength = 40;
    const int sleepTime = 100;
    Gdk.Color red = new Gdk.Color(255, 0, 0);

    protected async void OnSelectVolumeToggleButtonToggled(object sender, EventArgs e)
    {

        if (selectVolumeToggleButton.Active)
        {
            lVolumeLabel.ModifyFg(StateType.Normal, red);

            int startIndex = 2;
            string piLeft = pi.Substring(0, startIndex);
            string piRight = pi.Substring(startIndex, displayLength);

            while (selectVolumeToggleButton.Active)
            {
                lVolumeLabel.Text = piLeft;
                rVolumeLabel.Text = piRight;

                await Task.Delay(sleepTime);

                startIndex++;
                piLeft = piLeft[1].ToString() + piRight[0].ToString();
                piRight = piRight.Substring(1) + pi[(startIndex + displayLength - 1) % pi.Length].ToString();
            }

        }
        else
        {
            rVolumeLabel.Text = " <-- New volume set. Well done!";
        }
    }

}

Update2:我收到了要显示的崩溃消息。

*** Error in `/app/bin/mono': double free or corruption (fasttop): 0x00007f0340003350 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6da05)[0x7f035a5ada05]
/lib/libc.so.6(+0x77996)[0x7f035a5b7996]
/lib/libc.so.6(+0x7817e)[0x7f035a5b817e]
/app/lib/libgdk-x11-2.0.so.0(gdk_region_intersect+0x6f)[0x7f035315f32f]
/app/lib/libgdk-x11-2.0.so.0(+0x3d4f7)[0x7f035316a4f7]
/app/lib/libgdk-x11-2.0.so.0(gdk_window_process_all_updates+0x118)[0x7f035316b048]
/app/lib/libgdk-x11-2.0.so.0(+0x3e0a9)[0x7f035316b0a9]
/app/lib/libgdk-x11-2.0.so.0(+0x1dd37)[0x7f035314ad37]
/lib/libglib-2.0.so.0(g_main_context_dispatch+0x13a)[0x7f034bd3ac0a]
/lib/libglib-2.0.so.0(+0x48f88)[0x7f034bd3af88]
/lib/libglib-2.0.so.0(g_main_loop_run+0xc2)[0x7f034bd3b2a2]
/app/lib/libgtk-x11-2.0.so.0(gtk_main+0xa7)[0x7f035350aba7]
[0x41cdb804]
======= Memory map: ========
00400000-007a2000 r-xp 00000000 08:02 10500774                           /app/bin/mono-sgen
009a1000-009a5000 rw-p 003a1000 08:02 10500774                           /app/bin/mono-sgen
009a5000-009d8000 rw-p 00000000 00:00 0 
027a9000-02c7e000 rw-p 00000000 00:00 0                                  [heap]
41a86000-41a96000 rwxp 00000000 00:00 0 
41c35000-41d05000 rwxp 00000000 00:00 0 
7f0328000000-7f0328021000 rw-p 00000000 00:00 0 
7f0328021000-7f032c000000 ---p 00000000 00:00 0 
...

还有另外175行类似,如果需要,我可以包括它们。

1 个答案:

答案 0 :(得分:0)

可能有一个例外。尝试从终端运行它并在启动后查看那里描述的日志。