我受到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