2017-06-10 24 views
0

我受到this article on "worst volume slider designs"的启发而创建了类似的东西。我的小项目似乎在最初运行良好,但在进入while循环(见下文)之后经过了几秒钟(通常在十几个循环内)后,应用程序会简单地关闭或崩溃(我不确定哪个)。这是我第一次使用MonoDevelop和Gtk#,尽管我对C#有一些熟悉。我在Ubuntu 16.04上。窗口/应用程序自动关闭/崩溃(?)while while循环(MonoDevelop Gtk#2.0应用程序)

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

没有错误或警告报告,唯一的迹象表明我有些东西是关闭的,Build()有时(但并非总是)用消息“构造函数中的虚拟成员调用”加下划线。 (谷歌搜索这并没有帮助。)

我认为startIndex可能变得过大(?),但与startIndex = (startIndex + 1) % pi.Length更换startIndex++没有效果。 (这也似乎是不可能的,因为时间撞车不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行类似的,如果需要的话,我可以包括它们。

+0

什么是崩溃错误? – CodingYoshi

+0

对不起,如果我不清楚,它只是关闭,就好像我手动X窗口。没有任何错误。所有这些运行“调试”顺便说一句。 – nivk

+0

@CodingYoshi我在OP中添加了一个包含崩溃消息的更新。 TY – nivk

回答

0

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

+0

感谢您的留言,我在OP中添加了一个更新,并带有崩溃消息。 – nivk

+0

你的单声道版本呢? –

+0

单声道版本是5.0.1.1。 'MonoDevelop'是版本'7.0.1 build 24'。 – nivk