| |
| Leitfaden für die Materialauswahl im Spritzguss, ein Fachartikel
|
Autor
|
Thema: vb.net: Timer läuft nicht (5062 mal gelesen)
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 02. Nov. 2011 16:30 <-- editieren / zitieren --> Unities abgeben:
Ich schon wieder ... Ich versuche timergesteuert eine Progressbar laufen zu lassen. Aber es tut sich nichts!
Code: Sub StartProgressbar() 'Progressbar läuft timergesteuert durch MyProgressBar.Enabled = True ProgressTimer.Interval = 10 ProgressTimer.Start() End Sub Sub StopProgressbar() ProgressTimer.Stop() MsgBox("Timer gestoppt") End Sub Private Sub ProgressTimer_Tick(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles ProgressTimer.Tick Dim n As Integer TimerCounter += 1 lblHinweis.Text = TimerCounter.ToString n = MyProgressBar.Value n += 10 If n > MyProgressBar.Maximum Then n = 0 MyProgressBar.Value = n MyProgressBar.Update() MsgBox("Tick") End Sub
Zu Beginn meiner Aktion wird per StartProgressbar() der Timer "Progresstimer" gestartet, per StopProgressbar() wieder gestoppt... so der Gedanke. Aber die "Tick"-Procedur wird offenbar nie durchlaufen. ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Nasenheim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
tbd Moderator Teamleiter
Beiträge: 825 Registriert: 26.01.2006 Dell Percision T5400 Intel(R) Xeon(R) CPU X5460 @ 3.16GHz 3,25 GB RAM Nvidia Quadro FX 4600
|
erstellt am: 02. Nov. 2011 16:53 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000
|
erstellt am: 03. Nov. 2011 08:18 <-- editieren / zitieren --> Unities abgeben:
Hallo Daniel, das stimmt so nicht ganz, Style bestimmt nur das Aussehen. Wenn ich den Value-Wert der Progressbar einzeln bei jeder Aktion erhöhe, funktioniert es- unabhängig vom Style. Das ist aber sehr mühsam, da ich dazu im ganzen Programm verteilt dutzende Stellen hab, wo ich das eintragen muss. Als Workaround habe ich das jetzt mal so gemacht, ist aber nicht schön. Ich möchte einfach, dass die Progressbar voranschreitet bis sie voll ist, und dann wieder von vorne anfängt, solange etwas getan wird. Damit der User nicht meint, das Programm faulenzt vor sich hin. Und darum würde ich das gerne einfach über den Timer machen. Ich verstehe nur nicht, warum da nix passiert. [Edit]hab grad nochmal rumprobiert, den Timer und eine Progressbar in eine andere Form gesetzt und dort gestartet... solange das Programm irgendwas tut, scheint der Timer untätig. Erst wenn alle Aktionen beendet sind und das Programm wieder auf Eingaben wartet, läuft der Timer und mit ihm die Progressbar. Das ist doch aber nicht der Sinn der Sache^^[/Edit] ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Nasenheim
[Diese Nachricht wurde von KMassler am 03. Nov. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
arossbach Mitglied Ingenieur Masch.bau
Beiträge: 1181 Registriert: 13.06.2001 Wildfire 3 M230 PDMLink 9.1 simufact.forming 10.1.1 Windows XP Professional 2002 Service Pack 2 Dell Precision WorkStation 390 3,25 GB RAM Grafik: Quadro FX 3500
|
erstellt am: 03. Nov. 2011 09:29 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Wenn es nur darum geht, dann machs doch ohne Progressbar '...blablabla...... Dim i As Integer Private Sub Form_Load() i = 10 Label1.Width = 1 End Sub Private Sub Timer1_Timer() Label1.Width = Label1.Width + i If Label1.Width > 4135 Then '4140 ist max Label1.Width = 1 End If End Sub 'blablabla..... Gruß ------------------ -Axel- CROSSFIRE Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000
|
erstellt am: 03. Nov. 2011 09:59 <-- editieren / zitieren --> Unities abgeben:
Hallo Axel, ist das mit VB6 erstellt? In Vb.net heißt die prozedur Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Aber das nur nebenbei. Das Problem ist nicht die Progressbar! Wegen mir kann das auch ein Label sein oder ein Bild oder sonst was. Das Problem ist der Timer! Die Timer-Prozedur wird nicht aufgerufen, solange das Programm noch was anderes macht. Und das verstehe ich nicht. Denn der Sinn dieser Timer-Prozedur ist ja gerade, dass sie regelmäßig abgearbeitet wird, auch wenn das Programm mit anderen Dingen beschäftigt ist. Sonst brauch ich die ja nicht. ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Nasenheim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Patrick Weber Mitglied Konstruktionstechniker, Admin
Beiträge: 659 Registriert: 20.11.2006 Win11 Pro 23H2 Core i7-12700, 32GB RAM, Quadro P620 Creo Elements/Direct 19.0 M030 ModelManager 19.0 License Server 19.0 F000 clisp,VB.net,VBA,AHK,Python
|
erstellt am: 03. Nov. 2011 10:24 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Zitat: Original erstellt von KMassler: Denn der Sinn dieser Timer-Prozedur ist ja gerade, dass sie regelmäßig abgearbeitet wird, auch wenn das Programm mit anderen Dingen beschäftigt ist.
Richtig, aber die im Timer ausgeführten Abläufe aktualisieren nicht die Form, wenn diese mit einer regulären Funktion oder Subprozedur beschäftigt ist. Da hilft dir nur ein Application.DoEvents() in der Funk/Sub der Form oder du musst dich mal mit Threads beschäftigen.
------------------ Grüße aus Sachsen pw Karl Marx ist tot, Einstein ist tot, und mir ist auch schon ganz schlecht! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Ehrenmitglied V.I.P. h.c. Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2700 Registriert: 18.10.2005
|
erstellt am: 03. Nov. 2011 10:27 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 03. Nov. 2011 11:46 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Patrick Weber: Richtig, aber die im Timer ausgeführten Abläufe aktualisieren nicht die Form, wenn diese mit einer regulären Funktion oder Subprozedur beschäftigt ist. Da hilft dir nur ein Application.DoEvents() in der Funk/Sub der Form oder du musst dich mal mit Threads beschäftigen.
Hmm...meine lange Leitung... lösen wir uns mal von dem, was der Timer ausführen soll. Das erste Problem ist doch, dass die Prozedur Tick überhaupt nicht durchlaufen wird, egal was darin passiert. Wo soll ich das doEvents plazieren? Wenn ich das überall einbauen muss, wo etwas passiert, damit die Progressbar (oder sonst was) aktualisiert wird... dann kann ich da auch gleich eine Sub aufrufen, die genau das tut. Wozu hat man dann den Timer? Irgendwie versteh ichs nicht. @Michael: Asche über mein Haupt, die war tatsächlich disabled. Aber das macht keinen Unterschied^^
------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Nasenheim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
arossbach Mitglied Ingenieur Masch.bau
Beiträge: 1181 Registriert: 13.06.2001
|
erstellt am: 03. Nov. 2011 12:09 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Zitat: Original erstellt von KMassler: Hallo Axel,ist das mit VB6 erstellt? In Vb.net heißt die prozedur Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Aber das nur nebenbei. [b]Das Problem ist nicht die Progressbar! Wegen mir kann das auch ein Label sein oder ein Bild oder sonst was. Das Problem ist der Timer! Die Timer-Prozedur wird nicht aufgerufen, solange das Programm noch was anderes macht. Und das verstehe ich nicht. Denn der Sinn dieser Timer-Prozedur ist ja gerade, dass sie regelmäßig abgearbeitet wird, auch wenn das Programm mit anderen Dingen beschäftigt ist. Sonst brauch ich die ja nicht. [/B]
Ja, ich weiß. Ist VB6 und soll auch nur auf den Progressbar Fake hinweisen. Habe hier kein VB.Net am Start. Aber zum Problem: Hmmmm..., also eigentlich ist es kein Timer Problem, sondern ein Aktualisierungs- oder Refreshproblem, oder ? -Axel- Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 03. Nov. 2011 12:12 <-- editieren / zitieren --> Unities abgeben:
|
Patrick Weber Mitglied Konstruktionstechniker, Admin
Beiträge: 659 Registriert: 20.11.2006
|
erstellt am: 03. Nov. 2011 12:43 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Als Beispiel: Code: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' Starte Timer StartProgressbar() ' Beginne Abarbeitung im Hauptprogramm For i As Long = 0 To 1000000 ' Tue irgendetwas lblForm.Text = i.ToString ' Aktualisiere UI (Form) Application.DoEvents() Next ' Stoppe Timer StopProgressbar() End Sub
StartProgressbar() aktiviert deinen Timer. Dann lässt du dein Hauptprogramm durchlaufen, hier eine for-Schleife. In dieser Schleife tust du etwas. Dadurch wird das Neuzeichnen der Form unterdrückt bzw. funktioniert nicht zuverlässig. Ein DoEvents hilft hier die UI zu aktualisieren und ansprechbar zu halten. StopProgressbar() deaktiviert den Timer wieder, wenn das Hauptprogramm durchgelaufen ist. Das ist aber mMn keine schöne Lösung, da die Progressbar "ruckelt". Ohne Timer und Style Marquee sieht es gut aus, wenn eine "Schleifenrunde" schnell durchlaufen werden kann.
Code: Public TimerCounter As Integer = 0 Sub StartProgressbar() MyProgressBar.Enabled = True MyProgressBar.Style = ProgressBarStyle.Marquee MyProgressBar.MarqueeAnimationSpeed = 20 End Sub Sub StopProgressbar() MyProgressBar.Style = ProgressBarStyle.Blocks MyProgressBar.Enabled = False End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click StartProgressbar() For i As Long = 0 To 20000 lblForm.Text = i.ToString Application.DoEvents() Next StopProgressbar() End Sub
------------------ Grüße aus Sachsen pw Karl Marx ist tot, Einstein ist tot, und mir ist auch schon ganz schlecht! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 03. Nov. 2011 13:43 <-- editieren / zitieren --> Unities abgeben:
Ich verstehe nicht, was das Ausführen der Prozedur timer_tick mit dem Auffrischen der UI zu tun hat. Es geht mir gerade vorrangig darum, dass diese sub nicht durchlaufen wird!!! - ganz egal, was sie tut. Das mit der Progressbar ist nur die aktuelle Anwendung davon. Das mit dem Einfügen von Application.DoEvents() ist keine Lösung, da ich eben nicht nur eine schöne Schleife habe, sondern viele viele Aktionen, die nacheinander ablaufen, ohne in einer Schleife zu stecken. D.h. ich müsste überall in meinem Programm verteilt das Application.DoEvents() einfügen. Was habe ich damit gewonnen? Da kann ich genauso oft einen Aufruf "ErhöheDieProgressbarUndFrischeSieAuf" einfügen... genau das mache ich als Workaround und das funktioniert. Ist aber eben auch ruckelig. Vor allem, wenn z.B. eine externe Aktion ausgeführt und auf das Ergebnis gewartet wird, da passiert eben gar nix. Ich ziehe das Fazit: Timer taugt nix bzw. tut nicht, wozu er da ist. Schade drum. Ich gebs erst mal auf, muss ja irgendwann auch fertig werden mit dem Programm, dann eben ohne. Aber ich danke euch allen für die Mühe und die Geduld mit mir
------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Nasenheim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Patrick Weber Mitglied Konstruktionstechniker, Admin
Beiträge: 659 Registriert: 20.11.2006
|
erstellt am: 03. Nov. 2011 15:00 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Das ist eine Verständnisfrage. Du scheinst einfach den Einsatzbereich und die Möglichkeiten eines Timers maßlos zu überschätzen. Ich kann nur immer wieder sagen: Threading! Lagere die Hauptaufgabe in einen Thread aus, dann wird die UI des Programmes nicht blockiert und dein Timer kann tun, was er will. Aber das wäre ja mit Aufwand verbunden... Thread, evtl. noch Delegates und Invokes... ------------------ Grüße aus Sachsen pw Karl Marx ist tot, Einstein ist tot, und mir ist auch schon ganz schlecht! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mseufert Ehrenmitglied V.I.P. h.c. Freiberuflicher CAD/CAM Ingenieur
Beiträge: 2700 Registriert: 18.10.2005 HP Z420 WIN7 64 Win 10 UG NX6-2306 3D Printer Prusa MK2 S
|
erstellt am: 03. Nov. 2011 15:40 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000
|
erstellt am: 25. Nov. 2011 10:36 <-- editieren / zitieren --> Unities abgeben:
|
MWN Mitglied Dipl.-Ing.
Beiträge: 492 Registriert: 14.02.2007
|
erstellt am: 25. Nov. 2011 12:59 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Ähm, trau mich kaum die Frage zu stellen: hast du mal den Timer mit Timer.Enabled=True gestartet, anstelle von Timer.Start? Grüße Tobias ------------------ Besucht mich doch mal in meiner Tischlerei "...Kommunikation ist nur so gut wie ihr Ergebnis..." - frei nach Richard Bandler / John Grinder "...Wenn du das tust, was du schon immer tust, wirst du auch nur das erhalten, was du schon immer erhalten hast..." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 28. Nov. 2011 08:05 <-- editieren / zitieren --> Unities abgeben:
Hi Tobias, sowohl als auch. Der Timer läuft auch-grundsätzlich. Aber eben nicht gleichmäßig durch, wie ich das erwartet hätte. In meinem Fall finden hier externe Aktivitäten mit Wartezeiten statt (z.B. Gewichtsberechnung in Baugruppen in SolidWorks), während denen der Timer einfach nicht tickt. Aber wie gesagt- im Moment ist das Thema aus Zeitgründen auf Eis gelegt, ich musste anderes vorziehen. Aber irgendwann muss ich mir das Thema Threading wieder anschauen (mir grausts jetzt schon). ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Nasenheim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000
|
erstellt am: 09. Apr. 2013 10:39 <-- editieren / zitieren --> Unities abgeben:
Laaang ist's her, aber jetzt habe ich mich endlich wieder damit beschäftigen können. Der Tipp mit dem threading war der Hinweis auf den richtigen Weg. Nach einigem Gesuche im Internet (neudeutsch Googlen) mit vielen nicht funktionierenden Beispielen hab ich's endlich geschafft. Meine Progressbar wird jetzt in einem extra thread animiert und wird nicht mehr von irgendwelchen anderen Tätigkeiten ausgebremst- zumindest meistens. Vermutlich müsste ich auch diese anderen Aktionen auslagern, aber der Aufwand wäre mir hier echt zu groß. Ein kleines Testbeispiel habe ich mal angehängt. ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |