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

1

10.07.2014, 12:28

C# GUI - Thread teilweise einfrieren

Hallo liebe Community,

ich hätte da wieder einmal eine Frage^^.

Meine Situation:

ich habe einen System.Windows.Forms.Timer der jede 2 Sekunden überprüft ob sich eine Datei geändert hat( bitte nicht um den Sinn diskutieren, das sind alles noch ÜBUNGEN^^ für mich), solange der Timer jede 2 Sekunden das überprüft und die Funktion im Tick-Event "false" liefert, möchte ich den GUI - Thread nur soweit einfrieren, das keine unnötigen Ressourcen verbraucht werden, wenn sie nicht beansprucht werden müssen. Gibt die Überprüfungsfunktion "true" zurück, kann der ganze GUI - Thread wieder starten.

Hättet ihr da evtl Tipps/Vorschläge, wie immer danke im voraus :)

Ps (Bitte bitte nicht den Sinn diskutieren, lerne noch mit Threads und etc...)

Mfg

ProgFrog

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

2

10.07.2014, 12:49

Wenn der Timer in einem Extra-Thread läuft, kannst du den Main-Thread einfrieren, allerdings ist das nicht immer optimal und dein Programm wird dann nicht mehr reagieren.
Außerdem verbraucht ein ungenutztes GUI so gut wie keine Ressourcen (mal abgesehen von Visual Studio).

3

10.07.2014, 12:53

Kann ich es denn nicht so handhaben, das der GUI Thread im internen zwar "einfriert" ich jedoch die Form dennoch bewegen, minimieren, sachen umstellen, also iwie mit der Form aus Komponentensicht, immernoch damit agieren kann, nur das intern alle anderen Ressourcen sozusagen geblockt sind?

Also quasi den Main GUI Thread in 2 teilen. der 1. Thread kümmert sich um die komponenten Events etc und der 2. Um den Rest was es da noch so gibt?

Ich bitte um Entschuldigung wenn das kompletter Quark ist was ich erzähl, lerne noch grad diese Threadgeschichten^^

4

10.07.2014, 13:07

Was ich ja feststellen muss, das die KOMPLETTE GUI einfriert wenn meine Anweisung imt

C#-Quelltext

1
private void eventWatcher_Tick(object sender, EventArgs e)


ausgeführt werden

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

10.07.2014, 13:14

Wie bereits geschrieben wurde, würde das dazu führen, dass das Programm nicht mehr reagiert.
Meines Wissens gibt es eine Methode, die das Abarbeiten aller aufgelaufenen Events zur Folge hat, welche in bspw. sehr lang dauernden Schleifen verwendet werden könnte. Abgesehen davon, dass man in einem normalen Fall eher Threads verwenden würde, müsstest du die Methode häufiger als nur jede 2. Sekunde aufrufen, da sonst Interaktionen mit dem UI sehr wahrscheinlich ruckelig wären.

Vielleicht solltest du als Übungen nicht gerade solche Dinge nehmen, die keine praktische Relevanz haben. Notfalls könntest du bspw. im Chat oder hier im Forum nachfragen, was denn eine gute Übung für ein gegebenes Thema wäre.


Nachtrag:
Welcher Timer wird verwendet? System.Timers.Timer oder System.Threading.Timer? Wird eventuell kein Thread für das Event erzeugt?
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Sacaldur« (10.07.2014, 13:24)


6

10.07.2014, 13:23

Ok und danke für die Hilfe :)

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

7

10.07.2014, 18:07

Solange du die Nachrichtenschleife nicht einfrierst und nur das Buttonhandling, kannst du das was tun, aber nicht in C# glaube ich.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

8

10.07.2014, 18:26

aber nicht in C# glaube ich.


Warum sollte das nicht in C# gehen? Was hat vor allem die Sprache damit zu tun? Ob das geht oder nicht hängt von der WinAPI ab und nicht von der Sprache, mit der man diese anspricht O.o

MitgliedXYZ

Alter Hase

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

9

10.07.2014, 18:43

Vielleicht hilft dir ja

C#-Quelltext

1
Application.DoEvents();

http://msdn.microsoft.com/de-de/library/…(v=vs.110).aspx

Ich hab deinen Beitrag nur überflogen, aber wenn du in einer Schleife im Main-Thread die GUI aktualisieren, und Eventsverarbeiten willst, hilft es, die oben genannte Methode bei jedem Schleifendurchlauf, etc., aufzurufen.

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

10

10.07.2014, 18:55

Ich hab mit C# das WinForms-Zeug gemeint, sicher kann man auch auf die WinAPI zugreifen, ist in meinen Augen allerdings unnötig, kann man gleich in C++ machen.

Werbeanzeige