我受到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
的切換按鈕以及兩個名爲lVolumeLabel
和rVolumeLabel
的標籤。
沒有錯誤或警告報告,唯一的跡象表明我有些東西是關閉的,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行類似的,如果需要的話,我可以包括它們。
什麼是崩潰錯誤? – CodingYoshi
對不起,如果我不清楚,它只是關閉,就好像我手動X窗口。沒有任何錯誤。所有這些運行「調試」順便說一句。 – nivk
@CodingYoshi我在OP中添加了一個包含崩潰消息的更新。 TY – nivk