2017-06-10 67 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