PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : VB6 Timer bleibt beim bewegen des Fensters kurz stehen



chr-mt
22.03.2007, 10:50
Hi,
hab' gerade ein Problem mit VB6.
Zum testen habe ich mal folgendes gemacht:
Ein Formular mit einem Timer und einem Label.
Alle 10ms soll der Wert ein Wert hochgezählt werden und im Label angezeigt werden.
(Ich weiß, die VB-Timer sind wohl nicht gerade genau)
Wenn ich nun das Teil während der Laufzeit verschiebe, bleibt mein Timer für etwa eine halbe Sekunde bis etwa eine Sekunde stehen.
Allerdingsnur beim ersten "Anfassen"
Alle weiteren Verschiebevorgänge bringen den Timer nicht mehr aus dem Tritt.
Gehe ich auf die Clip Controls (verkleinern oder vergrößern) und halte die Maustaste gedrückt, bleibt das Teil komplett stehen.

Kann man das irgendwie verhindern?
(ohne das Formular zu disablen)




Public a As Integer
Private Sub Form_Load()
Timer1.Interval = 10
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
a = a + 1
If a > 1000 Then
a = 0
End If
Label1.Caption = a
End Sub



EDIT:hab' gerade gemerkt, ab und zu bleibt der Timmer auch beim erneuten anfassen stehen.
Und in VB.Net ist der Effekt übrigens der gleiche, habe ich gerade festgestellt.

Gruß
Christopher

SprinterSB
22.03.2007, 11:25
Ohne daß ich irgendwelche Ahnung von VB hab (oder haben möchte... O:) )

-1-

MS-Windows und Linux sind keine Echtzeit-Betriebssysteme. Man kann also nicht davon ausgehen, daß solche Aufgaben innerhalb bestimmer Zeiten ausgeführt werden oder nicht für längere Zeit (bis zu Sekunden) Interrupts gesperrt werden (GUI-Zeugs, Festplatten-Zugriffe, Speichefranforderungen, ...)

-2-

Wird der Timer in einem eigenen Thread gestartet? Das hilft evtl. wenn der Thread eine genügend hohe Priorität hat. Ist aber auch keine Garantie, siehe -1-

chr-mt
22.03.2007, 12:07
Hi,
hab' gerade mal einen alternativen timer von www.activevb.de ausprobiert der in einem eigenen thread läuft und laut Beschreibung von keinen Vorgängen in seiner Arbeit gestört wird. Gleiches Problem :(
Daß Windows kein Echtzeit Betriebssystem ist, ist klar, aber so ein totales stoppen des Timers finde ich doch etwas krass.

Gruß
Christopher

SprinterSB
22.03.2007, 17:01
Wahrscheinlich wird garnicht mal der Timer gestoppt, sondern es geht "nur" eine/mehrere IRQs flöten.

Hast du die Priorität des Threads hochgesetzt? Evtl ist auch die Priorität der VB-Machine das Problem, weil die ja die IRQs behandelt...

oratus sum
04.04.2007, 15:10
Na das ist ja noch nciht sooo schlimm!
Wart einmal bis du 5 Timer hast und du ne MsgBox machst! Dann bleiben alle Timer stehen solange die MsgBox da is!

Man könnte versuchen die Systemzeit andauernd abzurufen mit einer Schleife! Dann vergleicht man es und man hat ne Timer! Allerdings geht das nur in Sekunden größe und nicht ms! probiers mal aus!

chr-mt
04.04.2007, 18:56
Hi,
ist nich sooo schlimm, aber beim Bootloader blöd ;)
Ich steuere den Bascom Sample-Bootloader mit einem eigenen Programm an.
Wenn ich dann das Fenster bewege, gibt's eben einen Timout.
Übrigens gibt's den gleichen Effekt auch beim MCS Bootloader.
Der fliegt auch beim Fenster-Anfassen zeitweise raus. ;)
Naja, da muß ich wohl noch auf der µC Seite was Neues machen.
Übrigens funktioniert der Timer in dem vorher genannten Beispiel doch.
Nur die Darstellung in der Textbox bleibt stehen.
Der Timer läuft aber trotzdem weiter!



Gruß
Christopher

plusminus
05.04.2007, 01:12
soweit ich mich nich erinnern kann, kann der timer in VB6 nur alle 26ms sein Tick-Event auslösen..

NumberFive
05.04.2007, 07:39
bist du dir sicher das wirklich der Timer das problem ist ?

Klar windows arbeitet nur nachrichten ab und die WM_TIMER gehört nicht gerade u denen die Windows als wichtig ansieht aber ich denke eher das die Graphickarte zbw. der Graphic treiber dein problem ist den wenn du das Fentser bewegst sich die Oberfläschen element mit unter gelockt !

mach mal die sachen wie fensterinhalt bei ziehen aus dann sollte sich das problem nich mehr ganz so tragisch sein.

Teste mal mit zwei Timern der ein zum anzeigen der andere zum zählen vielleicht ist dann das problem ganz weg.

VB6 und Threads im haupt Thread von vb6 muß alles syncron sein so stürzt VB ab. Ich Programmiere viel mit C++ und muß software für unsere VB Truppe machen drum kenne ich da so einig probleme.

Gruß

xunwichtig
18.04.2007, 13:10
Declare Function SetTimer Lib "user32" Alias "SetTimer" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long

Declare Function KillTimer Lib "user32" Alias "KillTimer" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long

2 Api Funktionen, die unter VB keine Timer-verzögerung besitzen.

PS: www.google.de -> API-Guide ... ein super tool um API funktionen für VB zu finden.


JimJim
XUN