2017-06-10 2 views
0

Ich wurde von this article on "worst volume slider designs" inspiriert, um selbst etwas ähnliches zu erstellen. Mein kleines Projekt scheint zunächst gut zu laufen, aber nach einer variablen Anzahl von Sekunden (in der Regel innerhalb von etwa einem Dutzend) nach dem Eintritt in die while Schleife (siehe unten), die Anwendung einfach geschlossen oder abstürzt (ich bin mir nicht sicher welche). Dies ist das erste Mal, dass ich MonoDevelop und Gtk # benutze, obwohl ich etwas Vertrautheit mit C# habe. Ich bin auf Ubuntu 16.04.Fenster/Anwendung schließt/stürzt spontan (?) Innerhalb der While-Schleife ab (MonoDevelop Gtk # 2.0 App)

Meine MainWindow.cs ist unten, und alle anderen Formen werden automatisch mit der Gtk# 2.0 Project Vorlage generiert. Schließlich hat mein Fensterentwurf nur 4 Komponenten: einen festen Behälter, einen umschaltbaren Knopf, der selectVolumeToggleButton genannt wird, und 2 Kennsätze, die lVolumeLabel und rVolumeLabel genannt werden.

Es sind keine Fehler oder Warnungen gemeldet, der einzige Hinweis, dass etwas aus ist, ist, dass Build() manchmal (aber nicht immer) mit der Nachricht "Virtual Member Aufruf im Konstruktor" unterstrichen wird. (Googling das hat nicht geholfen.)

Ich dachte, dass startIndex kann zu groß (?), Aber startIndex++ mit startIndex = (startIndex + 1) % pi.Length ersetzt hatte keinen Effekt. (Dies scheint auch unwahrscheinlich, da die Zeit zum Absturz nicht mit sleepTime korreliert nicht.)

Update: Ein Haltepunkt auf der schließenden Klammer der if platziert wird nicht erreicht, wenn die Anwendung „abstürzt“.

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: bekam ich einen Crash-Meldung angezeigt werden soll.

*** 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 
... 

Es gibt weitere 175 Zeilen ähnlich, ich kann sie aufnehmen, wenn es erforderlich ist.

+0

Was ist der Absturzfehler? – CodingYoshi

+0

Entschuldigung, wenn ich unklar war, schließt es sich irgendwie so, als ob ich das Fenster manuell X'd habe. Keine Fehler überall. All dies läuft mit "Debug" übrigens. – nivk

+0

@CodingYoshi Ich habe ein Update im OP mit der Absturzmeldung hinzugefügt. TY – nivk

Antwort

0

Wahrscheinlich gibt es eine Ausnahme. Versuchen Sie, es von einem Terminal aus zu starten und schauen Sie sich die Protokolle an, die dort nach dem Start beschrieben werden.

+0

Danke für die Nachricht, ich habe ein Update im OP mit der Absturzmeldung hinzugefügt. – nivk

+0

Was ist mit Ihrer Mono-Version? –

+0

'Mono' Version ist' 5.0.1.1'. 'MonoDevelop' ist die Version' 7.0.1 build 24'. – nivk