我受this article on "worst volume slider designs"的启发,创造了类似的东西。我的小项目似乎最初运行良好,但在进入while
循环(见下文)后经过可变的秒数(通常在十几个左右)之后,应用程序只是关闭或崩溃(我' m不确定哪个)。这是我第一次使用MonoDevelop和Gtk#,虽然我对C#有一定的了解。我在Ubuntu 16.04上。
我的MainWindow.cs
位于下方,所有其他表单都是使用Gtk# 2.0 Project
模板自动生成的。最后,我的Window设计只有4个组件:一个固定容器,一个名为selectVolumeToggleButton
的切换按钮,以及两个名为lVolumeLabel
和rVolumeLabel
的标签。
没有报告任何错误或警告,我唯一的指示是关闭的是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行类似,如果需要,我可以包括它们。
答案 0 :(得分:0)
可能有一个例外。尝试从终端运行它并在启动后查看那里描述的日志。