Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

SilentDragon

Alter Hase

  • »SilentDragon« ist der Autor dieses Themas

Beiträge: 530

Wohnort: Köln

Beruf: Student

  • Private Nachricht senden

1

20.03.2013, 13:05

Dynamische GUI + Timer in C#

Hey Leute,

habe in meinem Projekt leider zuerst los geschrieben als vorher zu planen und stehe nun vor einem Problem ^^

Es handelt sich um eine Dynamische GUI -> Werden Buttons geklickt wird komplett neu gezeichnet (Buttons verschwinden neue tauchen auf)
das mach ich bis jetzt so:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
//Paint methode        
public void paint()        
{           
while (this.Controls.Count > 0)            
{                
this.Controls[0].Dispose();            
}
//Hier werden nun alle Buttons gezeichnen die benötigt werden ...
}
}


wurde ein Button geklickt wurde paint() nochmal aufgerufen, was bisher prima geklappt hat!
nun wollte ich aber eine Uhr dem Fenster hinzufügen was ich mit

C#-Quelltext

1
2
3
4
5
refreshtimer = new System.Windows.Forms.Timer();            
refreshtimer.Tick+= new EventHandler(refrestimer_Elapsed);            
refreshtimer.Interval = 1000;           
refreshtimer.Enabled = true;            
GC.KeepAlive(refreshtimer);


lösen wollte, refrestimer_Elapsed sieht so aus:

C#-Quelltext

1
2
3
4
5
6
7
8
private void refrestimer_Elapsed(object sender, EventArgs e)        
{           
 if (FormWindowState.Normal == this.WindowState)           
 {               
 paint();
//...            
}       
 }


Irgendwie vertragen sich meine Paint() methode und und der Timer nicht -> Einige Button klicks werden nicht ausgeführt oO
könnte mir wer aus der Zwickmühle helfen ? ^^
...

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

20.03.2013, 13:15

Was hast du denn da überhaupt vor? Wenn du möchtest, dass Buttons mal angezeigt werden und mal nicht, dann kannst du über die sie einfach unsichtbar bzw sichtbar machen. Dann benutzt du den Timer der WindowsForms. Daraus schließe ich mal, dass du mit Windowsforms arbeitest. Wenn du keinen guten Grund dafür hast, dann mein Hinweis, guck dir mal WPF an. Hat viele Vorteile.
Ansonsten wäre interessant zu sehen was bei einem Bittonclick passiert.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

20.03.2013, 13:18

Auch "GC.KeepAlive" ist keine sonderlich schöne Lösung.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

SilentDragon

Alter Hase

  • »SilentDragon« ist der Autor dieses Themas

Beiträge: 530

Wohnort: Köln

Beruf: Student

  • Private Nachricht senden

4

20.03.2013, 13:30

Hey,
Danke schonmal für die Antwort ;)
Also undsichtbar/sichtbar machen fällt für mich leider Flach, ein Beispiel -> Gibts eine Neue Mail, wird ein weiterer Button der Liste hinzugefügt und angezeigt, bzw. nach bedarf gelöscht etc.
An einen Umstieg auf WPF hab ich auch schon gedacht, ich glaube das hattest du mir auch schonmal woanders empfohlen ;)
Allerdings benutzte ich einige Bibliotheken und mein Programm ist mittlerweile sehr sehr umfangreich. Deshalb habe ich Panik das bei einer Umstellung noch mehr Probleme aufkommen :wacko:
Bezieht sich WPF NUR auf die GUI oder müsste ich bei einer Umstellung noch mehr berücksichtigen ? :(

eine Button-Methode sieht ungefähr immer so aus:

C#-Quelltext

1
2
3
4
5
6
7
8
 public void button_rldup(object sender, EventArgs e)
        {
            Label lab = (Label) sender;
            String[] IDArray = (String[]) lab.Tag;
            foreach (String t in IDArray)
                hmRolladenCMD(t, 1.0);
            paint();
        }
...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

20.03.2013, 13:34

Eine Umstellung ist nicht empfehlenswert. Die Änderungen sind massiv.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

20.03.2013, 14:30

Naja das mit der Umstellung ist so ne Sache. Je nachdem wie Vorbildlich man entwickelt, kann das natürlich ganz gut klappen. Dann musst du aber wirklich extrem bedacht darauf gewesen sein, die einzelnen Komponenten stark zu entkoppeln. Dann müsstest du wirklich "nur" die GUI Komponenten umschreiben. Aber da hat BC schon recht, das bringt immer ein gutes Stück arbeit mit sich. Und vor allem wenn das Projekt schon umfangreich ist, lohnt es sich vermutlich nicht mehr wirklich.
Ich verstehe aber noch nicht, warum du die Buttons nicht unsichtbar machen kannst. Das geht auch in deinem Beispiel.
Du hast einen Button der nur angezeigt werden soll, sobald eine neue Mail rein kommt. Der Button ist am Anfang unsichtbar (damit meine ich nicht ausgrauen, sondern absolut nicht zu sehen. Bei WPF gibt es den Wert collapsed. Da müsstest du das Äquivalent aus Windows Forms benutzen). Wenn nun eine neue Mail reinkommt, dann erstellst du keinen neuen Button, sondern setzt ihn einfach wieder auf Visible. An der Stelle, an welcher der Button normal gelöscht würde, setzt du ihn wieder auf Collapsed bzw das Windows Forms Äquivalent.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

20.03.2013, 14:39

Er sagte es wird ein neuer Button einer Liste hinzugefügt. Ich weiß nun natürlich nicht, ob er da tatsächlich mehrere Buttons haben kann oder ob er immer einen neuen erzeugt und den wieder killt statt ihn einfach auf Visible=false zu setzen. Kann aber durchaus sein, dass er tatsächlich eine dynamische Anzahl Buttons benötigt. Das muss er aber erstmal klären. Auch ist mir unklar, wofür er immer ein Draw/Paint macht.

In Zusammenhang mit einem Timer wird das aber generell Probleme machen, sofern nicht Invoke benutzt wird.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

20.03.2013, 15:17

Da braucht er ja nicht unbedingt einen Invoke. Wenn er aus dem UI-Thread arbeitet, kann er die Elemente ja direkt verändern. Und da er nichts explizit dazu schreibt, gehe ich erst mal vom UI Thread aus.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

20.03.2013, 15:37

Mit einem Timer ist er automatisch raus aus dem UI Thread.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

10

20.03.2013, 15:55

Zitat

Mit einem Timer ist er automatisch raus aus dem UI Thread.

Nein.
Außerdem würde WinForms einen Zugriff von einen anderen Thread per default automatisch erkennen und eine Exception werfen.

Zitat von »http://msdn.microsoft.com/de-de/library/system.windows.forms.timer.aspx«

Die Zeitgeberkomponente in Windows Forms ist Singlethreaded und auf eine Genauigkeit von 55 Millisekunden beschränkt.Wenn Sie einen Multithread-Zeitgeber mit größerer Genauigkeit benötigen, verwenden Sie die Timer-Klasse im System.Timers-Namespace.

Werbeanzeige