Funktion dauerhaft aufrufen

  • VB.NET

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von radio-ffk.

    Funktion dauerhaft aufrufen

    Ich fang gerade mit Vb an, nachdem ich mich durch alles mögliche gehangelt habe, von Python bis Javascript( X( ).
    Ich schreibe/beginne gerade mit einem Programm, das mir alle laufenden Prozesse auflisten soll, die ich dann beenden kann.

    Jetzt meine Frage, wie ist es in VB möglich eine Funktion dauerhaft aufzurufen? Muss ich mir einen Thread basteln der das macht oder gibts da eine besser Möglichkeit?

    Mfg
    Intel i7-4710HQ |Nvidia GTX 860M | 1TB SSHD| 8GB RAM 1600Mhz :saint:
    Intel Core Duo2 | 320GB | 4 GB RAM | Linux Debian :D
    AMD E-350 | 320GB| 6GB RAM :thumbdown:

    Quakxi schrieb:

    eine Funktion dauerhaft aufzurufen?
    Bevor Du Dich hier völig verrennst:
    Poste bitte mal ne vollständige Problembeschreibung bzw. Aufgabenstellung.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wie gesagt ich komme gerade von JS/Unityscript, wo eine function Update() jeden Frame aufgerufen wird, dementsprechend hab cih mir gedacht das es sowas auch in VB geben müsste(auch wenn das natürlich nicht mit nem Game Engine gleichzusetzten ist)
    Intel i7-4710HQ |Nvidia GTX 860M | 1TB SSHD| 8GB RAM 1600Mhz :saint:
    Intel Core Duo2 | 320GB | 4 GB RAM | Linux Debian :D
    AMD E-350 | 320GB| 6GB RAM :thumbdown:
    "Dauerhaft Funktion aufrufen" ist semantischer Unfug. Du meinst scheinbar, eine Endlos-Schleife, die eine Funktion immer wieder aufruft.
    Ja ist möglich, ist aber ungefähr das schlimmste, was man programmieren kann. In selbstgebastelten Game-Engines gibts sowas vlt, aber auch nur vielleicht.

    Ich weiß jetzt auchnicht, was diese Grauenhaftigkeit mit dem Auflisten von Prozessen zu tun hat.
    Also falls du kontinuirlich alle Prozesse beobachten willst, dann reicht auch ein Timer, der alle 300ms aktualisiert - wahrscheinlich reichen sogar alle 1000ms - so schnell wird ja keiner gucken, und so schnell gehen die Prozesse ja auch nicht an und aus.
    Probier dieses Beispiel mal aus (mind. .NET Framework 4 erforderlich):

    VB.NET-Quellcode

    1. Public Class Form1
    2. ' Indikator, ob die Liste aktualisiert werden soll oder nicht
    3. Private bList As Boolean = False
    4. ' beabsichtigt das Shown Event, da alles fertig geladen ist
    5. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    6. listProcesses()
    7. End Sub
    8. ' eine Methode, die asynchron läuft und den GUI Thread nicht behindert
    9. Private Async Sub listProcesses()
    10. bList = True
    11. While bList
    12. ListBox1.Items.Clear()
    13. For Each p As Process In Process.GetProcesses
    14. ListBox1.Items.Add(p.ProcessName)
    15. Next
    16. Await Task.Delay(1000)
    17. End While
    18. End Sub
    19. Private Sub ListBox1_MouseEnter(sender As Object, e As EventArgs) Handles ListBox1.MouseEnter
    20. ' damit die Items nicht aktualisiert werden während man mit der Maus auf der LB ist
    21. bList = False
    22. End Sub
    23. Private Sub ListBox1_MouseLeave(sender As Object, e As EventArgs) Handles ListBox1.MouseLeave
    24. ' wieder beginnen aufzulisten
    25. listProcesses()
    26. End Sub
    27. End Class

    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Jo, da gab es einen Trick, mit dem man das auch unter FW4.0 möglich machen konnte.
    Suche gerade danach.

    Edit:
    Bin mir nicht sicher ob das hier nur beim Windows Phone funzt. Wenn nicht, dann korrigiere ich gerne meine Aussage und sage, aber FW 4.5 ;).
    Und hier gibts noch was dazu.

    Scheinbar muss man nur n NuGet Package nachziehen.
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Habe bisher noch nie mit Paketen arbeiten müssen, ich denke/dachte mir, dass wenn man ein NuGet Paket installiert, dieses beim Vertrieb der exe mitgeliefert wird.
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..
    Das weiß ich leider nicht, musst dich mal schlau machen.

    Aber nochmal was dazu wegen einfrieren.
    Wenn ich zb etwas aufwendiges bereche und so einer Schleife, dann hängt sich die Form nicht auf, aber es laggt wirklich extrem.
    Weil eben die Zeit für die Berechnung nicht im Nebenthread läuft.

    Wenn du wie hier kleinere Sachen hast, dann läuft es ganz gut.

    Ich würde es aber anders machen.

    Spoiler anzeigen

    C#-Quellcode

    1. private async void getting()
    2. {
    3. await Task.Run(() =>
    4. {
    5. do
    6. {
    7. this.Invoke(new Action(() => listBox1.Items.Clear()));
    8. foreach (Process p in Process.GetProcesses())
    9. {
    10. this.Invoke(new Action(() => listBox1.Items.Add(p.ProcessName)));
    11. }
    12. System.Threading.Thread.Sleep(1000);
    13. } while (true);
    14. });
    15. }



    Hat halt einen Nachteil, dass du Invoken musst.
    Hmm, hatte damit bisher noch nie Probleme, naja man muss halt immer schauen für welchen Zweck und in diesem Fall reichts ja dicke :)..
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    RodFromGermany schrieb:

    Poste bitte mal ne vollständige Problembeschreibung bzw. Aufgabenstellung.

    Quakxi schrieb:

    Wie gesagt ... , dementsprechend hab ich mir gedacht
    Frage leider nicht beantwortet. ;(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RootBox, @Ninja: Schön, da habt ihr nun einen Timer durch eine Threading-Konstruktion ersetzt, und müsst Asyncen oder Invoken - der Vorteil wäre welcher?

    Und eine "dauerhaft aufgerufene Funktion" ist das immer noch nicht, und das Anhalten eures "Timers" erfordert zusätzlichen Aufwand.
    Also warum nicht einen Timer nehmen, wenn man einen Timer braucht?

    Und leider auch Codes dazu geliefert, was für den Timer-Ansatz noch nicht geschehen ist, weil mit einem Timer isses so simpel, da sollte der TE selbst drauf kommen.
    Und für einen Anfänger scheints mir vordringlich, zu erlernen, einen Timer aus der Toolbox zu ziehen, Enabled und Interval festzulegen und das Tick-Event zu behandeln.
    Bevor man in Threading einsteigt, und sich angewöhnt, Timer-Jobs durch Threading zu verkomplizieren.

    Und das alles aufgrund einer eher geratenen als vom TE formulierten Problemstellung.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ich mag das Timer Control halt nicht, deswegen versuch ichs zu vermeiden. Ein Control erscheint mir die schlechtere Wahl als ein Sprachkonstrukt.

    So oder so bleibts jedem selber überlassen.
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..