Timer.tick freeze? Label.txt ändert sich selten oder wenn mit maus über form/label geführt wird?

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von seby1302.

    Timer.tick freeze? Label.txt ändert sich selten oder wenn mit maus über form/label geführt wird?

    Hallo leute ich schon wider.

    Ich habe seit langen ein merkwürdige fehler, nun sehe ich aber das mein app bei 2 leute( beide haben win10 notebook A4 processor), mein app nur extrem lansgam läft.

    Ich versuchs mal zu erklären.....

    Ich habe da ein Browser game, wo mit maus Point, timer.tick etc arbeitet, nun ist das so das z.b wen ein klick ausgefürt wird, wird der wert der label.text auf +1, +2 gesetzt und so weiter, aber manchmal auch nicht, manschmal ändert sich der wert erst wenn ich über das form oder label mit der maus drüber gehe(nicht klicken nur maus drüber bewege), das sieht dann so aus als würde dann der timer schneller laufen, aber auch nur solange ich die maus bewege.

    das ist aber nicht nur mit dem text im label, sondern auch mein pixelserch funktion, läuft einigermaßen je nach pc schneller oder langsamer, aber alle haben was gemeinsam, bewege ich die maus über das form/label etc.. wird der pixel mit farbe x sofort erkannt, wirklich sofort was er sonst nur in unregelmeßige abständ erkennen würde. ?(

    wodran kann das liegen. :(
    ja nur was, habe option strict on und option infer on und habe gennau 2 fehler beide ....

    Error BC30574 Option Strict On disallows late binding.

    VB.NET-Quellcode

    1. Dim InitialZoom As Integer = 100
    2. Public Enum Exec
    3. OLECMDID_OPTICAL_ZOOM = 63
    4. End Enum
    5. Private Enum execOpt
    6. OLECMDEXECOPT_DODEFAULT = 0
    7. OLECMDEXECOPT_PROMPTUSER = 1
    8. OLECMDEXECOPT_DONTPROMPTUSER = 2
    9. OLECMDEXECOPT_SHOWHELP = 3
    10. End Enum
    11. Public Sub PerformZoom1(ByVal Value As Integer)
    12. Try
    13. Dim Res As Object = Nothing
    14. Dim MyWeb As Object = WebBrowser2.ActiveXInstance.ExecWB(Exec.OLECMDID_OPTICAL_ZOOM, execOpt.OLECMDEXECOPT_PROMPTUSER, CObj(Value), CObj(IntPtr.Zero))
    15. Catch ex As Exception
    16. MsgBox(ex.Message)
    17. End Try
    18. End Sub


    rote markierung auf WebBrowser2.ActiveXInstance.ExecWB

    und das andre

    VB.NET-Quellcode

    1. Dim Netzwerk As Object
    2. Dim pcusername As Object
    3. Netzwerk = CreateObject("wscript.network")
    4. pcusername = Netzwerk.UserName


    markierung auf Netzwerk.UserName

    aber daran liegt es nicht
    nee - daran liegt es nicht.
    So kompiliert der Code ja garnet, und also kann das Prog ja auch nicht extrem langsam laufen.

    Tja, .ActiveXInstance und CreateObject() sind leider unmanaged Properties/Methoden, zu denen der Compiler keine Typinformationen hat.
    In dem Fall (also wenn man das benutzen will) muss man für diese Datei Strict ausnahmsweise auf Off stellen, und hoffen, dasses geht.
    Am besten du legst eine partiale Klasse an, mit ausschliesslich dem Code, der mit derlei unmanaged Krempel hantiert - alles andere in der Strict On - Haupt-Klasse lassen.
    Um das zu tun google das Stichwort Partial.

    Löst aber nicht das Eingangs-Problem, aber der gezeigte Code wird vmtl. überhaupt nicht durchlaufen, wenn das Performance-Problem auftritt - oder?
    Überprüfe das mal mittels Haltepunkt oder Debug-Meldungen.

    Falls du dich mit Haltepunkt oder Debug-Meldungen nicht auskennst - nicht ignorieren, sondern nachfragen.
    Habe ich schon versucht die beide Coden tun was sie sollen.

    Mit da dran liegt es nicht meinte ich. Mit mein Mausover Problem. Ich hab da soger an die 80% der restlichen Code ausgeblendet um zu testen was da stören könnte, also nur das nötigsten am laufen gehalten.

    Und ich hab auch kein handle etc der auf mausover reagieren könnte.

    Aber eine frage hätte ich da schon. Weil ich mit nicht sicher bin ob das richtig so ist.

    Und zwar läuft mein Pixelsearch Funktion und die dazu gehörigen maus event in der timer.
    Ist das so richtig oder sollte ich das anders regeln.
    kommt auf den Code an.

    Fragen sinnvoll stellen

    aber eins kann schon gesagt werden: "in der timer" läuft keine dazu gehörigen maus event.
    Was immer du damit meinen magst - es ist Unfug.
    Ein event läuft nicht, sondern es wird entweder ausgelöst oder behandelt, und beides ist für das maus-event (egal welches) "in der timer" (was immer das sein mag) komplett unmöglich.

    Grundlagen: Fachbegriffe
    Ja du hast recht ich habs komich formuliert.
    was ich meinte ist, das mein pixelsuchfunktion im timer läuft und die funktionen für maus bewegung und etc auch.

    das sieht dan in etwa so aus

    VB.NET-Quellcode

    1. ' capture area as BMP
    2. Private Function CaptureToBitmap(ByVal X As Integer, ByVal Y As Integer, ByVal W As Integer, ByVal H As Integer) As Bitmap
    3. Dim img As New Bitmap(W, H)
    4. Using g = Graphics.FromImage(img)
    5. g.CopyFromScreen(New Point(X, Y), Point.Empty, New Size(W, H))
    6. End Using
    7. Return img
    8. End Function
    9. Private Sub Timer3_Tick(sender As Object, e As EventArgs) Handles Timer3.Tick
    10. Dim webLoc As Point = PointToScreen(WebBrowser3.Location)
    11. Dim webSiz As Size = WebBrowser3.ClientSize
    12. Dim WebBmp As Bitmap = CaptureToBitmap(webLoc.X, webLoc.Y, webSiz.Width, webSiz.Height)
    13. Dim b(WebBmp.Width * WebBmp.Height - 1) As Integer
    14. Dim bd As BitmapData = WebBmp.LockBits(New Rectangle(Point.Empty, WebBmp.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb)
    15. Marshal.Copy(bd.Scan0, b, 0, b.Length)
    16. WebBmp.UnlockBits(bd)
    17. Dim Edbbcolor1 As Color = ColorTranslator.FromHtml("#FFE9CC")
    18. Dim EdxColor1 As Integer = Edbbcolor1.ToArgb()
    19. For i As Integer = 0 To b.Length - 1
    20. If b(i) = EdxColor Then
    21. X = i Mod WebBmp.Width
    22. Y = i \ WebBmp.Width
    23. Color1Found = True
    24. Exit For
    25. End If
    26. Next
    27. If Color1Found = True Then
    28. WebBrowser3.Focus()
    29. Cursor.Position = PointToScreen(New Point(X, Y))
    30. mouse_event(MOUSEEVENTF_LEFTDOWN + MOUSEEVENTF_LEFTUP, 0, 0, 0, IntPtr.Zero)
    31. clickCount += 1
    32. collected1label.Text = clickCount.ToString
    33. sleep2(100)
    34. end if
    35. end sub

    " das ist ein gravierendes Memory-Leak." und wie könnte ich das sonst machen? wollte gerne diesen abschnitt als funktion machen.

    VB.NET-Quellcode

    1. Dim webLoc As Point = PointToScreen(WebBrowser3.Location)
    2. Dim webSiz As Size = WebBrowser3.ClientSize
    3. Dim WebBmp As Bitmap = CaptureToBitmap(webLoc.X, webLoc.Y, webSiz.Width, webSiz.Height)
    4. Dim b(WebBmp.Width * WebBmp.Height - 1) As Integer
    5. Dim bd As BitmapData = WebBmp.LockBits(New Rectangle(Point.Empty, WebBmp.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb)
    6. Marshal.Copy(bd.Scan0, b, 0, b.Length)
    7. WebBmp.UnlockBits(bd)


    aber ich weiß nicht wie ich dann auf b.Length , i und WebBmp zugreife für

    VB.NET-Quellcode

    1. For i As Integer = 0 To b.Length - 1
    2. If b(i) = EdxColor Then
    3. X = i Mod WebBmp.Width
    4. Y = i \ WebBmp.Width
    5. Color1Found = True
    6. Exit For
    7. End If
    8. Next

    Ps am ende der code WebBmp.Dispose() ist vorhanden.

    Time interval ist 100

    und sleep2(100) ist auch eine, habe mir da eine funktion gemacht weil wenn ich an der stelle wo ich eine do schleife laufen lasse kein pausen einlege hängt dann mein ganzer form.
    P.s nicht vom name irritieren lassen es gibt nur eine diese funktion.

    Die sleep funktion:

    VB.NET-Quellcode

    1. Public Sub sleep2(ByVal time As Integer)
    2. Dim stopw As New Stopwatch
    3. stopw.Start()
    4. Do Until stopw.ElapsedMilliseconds >= time
    5. Application.DoEvents()
    6. Loop
    7. stopw.Stop()
    8. stopw.Reset()
    9. End Sub



    so eine funktion würde ohne den sleep hängen bleiben und time.intervall funktioniert nicht, deshalb meine frage ob das alles im timer zu kloppen gut ist.

    VB.NET-Quellcode

    1. if sowieso= true then
    2. Do
    3. Cursor.Position = PointToScreen(New Point(X, Y))
    4. mouse_event(MOUSEEVENTF_LEFTDOWN + MOUSEEVENTF_LEFTUP, 0, 0, 0, IntPtr.Zero)
    5. If Color1Found = True and Color2Found = True Then
    6. Exit Do
    7. End If
    8. sleep2(100)
    9. Loop
    10. End if

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „seby1302“ ()

    OK dann versuche ich das mal zu ändern.

    Aber wie würdest du dann die bitmap erzeugen wen nicht im timer, das problem ist das es schnell gehen muss, eig ist das ganze jetzt schon zu larm...

    Da die faren in der eine sec da sind in der nexte aber auch wider weg am selben punkt, kannst dir ein blinlendes punkt vorstellen in verschiedene zeitabstände.

    seby1302 schrieb:

    VB.NET-Quellcode

    1. Y = i \ WebBmp.Width
    Machst Du Y = i \ WebBmp.Width (das ist in VB Integer-Division) und
    machst Du Option Strict On.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    Guckst du 3te post, Option Strict und Option Infer sind on dann wie oben beschrieben.
    zu Y = i \ WebBmp.Width gibt er mir kein fehler.

    ich würd die Bitmap nur einmal erzeugen, und dann immer wieder verwenden.


    Gennau das ist das problem, stell dir mal vor du hast ein oder mehreren punkten auf dem bild die in verschiedene zeitabstände blinken, da bringt mir nix ein bitmap ich brauche ehr 1 pro 100ms und selbst das ist schon zu langsam..

    Ich habe jetzt im timerx die Sleep2(xx) alle mit timerx.intervall = xx ersetzt und es funktioniert, k.a warum das damals hängen blieb.
    Jedenfals ist das ganze jetzt um gute 50% schneller geworden.

    Nun ist mir aufgefallen das, die label text die im timer sind, so ziehlich sofort auktuelisiert werden, nur die auserhalb der teimer ausgewertet werden, die aktuelisieren sich immer noch selten von alleine, meistens erst dann wen ich mit der maus über jergend ein label oder das form fahre.

    Auch die bitmaps macht er wie gesagt um einiges schneller, aber wenn ich mit der maus bewege ist es noch immer um min.. das doppelte schneller.

    Spielt es eine rolle ob grade der webbrowser focussiert ist?
    Kann es sein das er grade den eintrag machen will, aber da der timer so ziehmlich schnell wider der browser focussiert, das diese wert zwahr schon ersetzt wurde man es aber dan nicht sieht?
    @seby1302 Sorry, das war natürlich richtig in Deinem Code. :whistling:
    Ich muss wohl doch noch eine Tasse Kaffee trinken. :D
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ok habs jetzt mit dem labels die aktuelisieren sich nun sofort, das problem lag am focussieren der browser.
    Hhab es jetzt überall raus genommen, und ich meine das das mit der maus auch nicht mehr ist, gennau kann ich es aber erst sagen wen der college es auf sein notebook getestet hatt.
    Da hatt man es extrem gesehen, da der teilweiße erst überhaupt was gemacht hat wen man mit der maus über gefahren ist, sonst blieb es teilweiße komplet stehen oder nur im abstand von 1 min...
    Hallo Leute sorry wegen dem Doppel post aber das Problem besteht immer noch, es hat sich bei den andern PCs überhaupt nix getan.

    So nun mein test.

    Ich habe ein timer erstellt und dieser hatt ein timer Intervall von 100

    Diese ändert den Wert vom labelx um +1

    Nun ist das so das bei mir wie oben beschrieben, beim college dauert es aber teilweise über 10sec bis der den Wert auf +1 ändert. Jedoch sofort wen mit Maus bewegt wird.

    Also dachte ich mir, ich packe diese timer in ein neues Thread.

    Und siehe da es läuft immer schön gleichmäßig auch beim college, Maus Bewegung hatt kein Einfluß mehr.

    Also dachte ich mir das selbe mache ich mit dem oben genannten timer3.

    Problem er sagt mir bei.
    Dim webLoc As Point = PointToScreen(WebBrowser3.Location)

    Das ich von ein andern thread drauf zu greife als wofür es herstellt wurde.

    Wie mache ich das nun?
    Bitte um Hilfe

    EDIT

    Hat sich erledigt habe es mit invoke und delegate gemacht.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „seby1302“ ()