verschiedenes "Aussehen" bei Threads ... ?

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

verschiedenes "Aussehen" bei Threads ... ?

Beitrag von AUGE_OHR »

hi,

ich starte einen neuen Thread bei nEvent = xbe_None.

nun sieht es aber "verschieden"" aus bei nEvent = xbe_None (falsch)
oder wenn ich es "manual" ( so soll es aussehen) per Button starte.

bitte mal anschauen wenn ihr Zeit findet, danke

gruss by OHR
Jimmy

Code: Alles auswählen

*** snip ***
#include "XBP.CH"
#include "APPEVENT.CH"
#include "GRA.CH"
#include "FONT.CH"

STATIC lWorm       := .F.

PROCEDURE APPSYS
RETURN

PROCEDURE MAIN
LOCAL oDlg, oXbp
LOCAL nEvent, mp1, mp2
LOCAL oXbp1, oXbp2, oPB1, oPB2
LOCAL nTimeout  := 10
LOCAL aSize     := {600,400}
LOCAL aPos      := {100,100}
LOCAL lExit     := .F.
LOCAL aPP1      := {{XBP_PP_COMPOUNDNAME,FONT_HELV_LARGE}}
LOCAL nZahl     := 0
LOCAL nTime     := TIME()
LOCAL nWormTime := SECONDS()
LOCAL lShow     := .F.

   oDlg := XbpDialog():new( AppDesktop(),, aPos, aSize, , .F.)
   oDlg:taskList := .T.
   oDlg:title    := "TIMEZERO"
   oDlg:create()

   oXbp1 := XbpStatic():new( oDlg:drawingArea , ,;
    {100,300}, {400,50},aPP1 )
   oXbp1:caption := TIME()
   oXbp1:options := XBPSTATIC_TEXT_VCENTER
   oXbp1:create()

   oXbp2 := XbpStatic():new( oDlg:drawingArea , ,;
    {100,200}, {400,50},aPP1 )
   oXbp2:caption := TIME()
   oXbp2:options := XBPSTATIC_TEXT_VCENTER
   oXbp2:create()

   oPB1 := XbpPushButton():new(oDlg:drawingArea, , {100,100},;
    {200-10,50}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE },;
    { XBP_PP_FGCLR, -58 } } )
   oPB1:caption := "Show"
   oPB1:tabstop := .T.
   oPB1:create()
   oPB1:activate := {|| WORMSTART(oXbp2)  }

   oPB2 := XbpPushButton():new(oDlg:drawingArea, , {320,100},;
   {200-10,50}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE },;
   { XBP_PP_FGCLR, -58 } } )
   oPB2:caption := "EXIT"
   oPB2:tabstop := .T.
   oPB2:create()
   oPB2:activate := {|| lExit := .T. }

   oDlg:Show()
   SetappFocus(oPB1)

   lExit  := .F.
   DO WHILE .NOT. lExit
      // 
      // nTimeout
      //
      nEvent := AppEvent( @mp1, @mp2, @oXbp, nTimeout  )
      DO CASE
         CASE nEvent == xbeP_Keyboard .AND. mp1 == xbeK_ESC
            lExit := .T.

         CASE nEvent = xbe_None // nTimeout eingetreten
            nTime := TIME()
            DO CASE
               CASE VAL(SUBSTR(nTime,7,2)) ==  0 ; lShow := .T.
               CASE VAL(SUBSTR(nTime,7,2)) == 10 ; lShow := .T.
               CASE VAL(SUBSTR(nTime,7,2)) == 20 ; lShow := .T.
               CASE VAL(SUBSTR(nTime,7,2)) == 30 ; lShow := .T.
               CASE VAL(SUBSTR(nTime,7,2)) == 40 ; lShow := .T.
               CASE VAL(SUBSTR(nTime,7,2)) == 50 ; lShow := .T.
            OTHERWISE
               lShow := .F.
            ENDCASE

            IF (lShow .AND. .NOT. lWorm )
               nZahl++
               IF WORMSTART(oXbp2)
                  oXbp2:setCaption( TIME() )
*  oXbp2:setCaption( LTRIM(STR(nZahl)))
*  oXbp2:setCaption( LTRIM(STR(SECONDS()-nWormTime)))
*  nWormTime := SECONDS()
               ENDIF
            ELSE
               oXbp1:setCaption( TIME() )
               nZahl := 0
               lWorm := .F.
            ENDIF

      OTHERWISE
         oXbp:handleEvent( nEvent, mp1, mp2 )
      ENDCASE
   ENDDO
RETURN

STATIC FUNCTION WORMSTART(oDraw)
LOCAL oWormThread
   IF lWorm
      MSGBOX("Thread does run")
   ELSE
      lWorm := .T.
      oWormThread := Thread():new()
      oWormThread:start("WORM",oDraw)
   ENDIF
RETURN (lWorm)

PROCEDURE        WORM(oDlg)
LOCAL i,j
LOCAL oWStat := NIL
LOCAL nDraw  := oDlg:currentSize()[1]
LOCAL nHigh  := oDlg:currentSize()[2]
LOCAL aPP2   := {{XBP_PP_COMPOUNDNAME,FONT_HELV_LARGE}}

IF oWStat = NIL
   oWStat:= XbpStatic():new(oDlg,,{0,0},{100-20, nHigh},aPP2)
   oWStat:clipsiblings := .F.
   oWStat:create()
   oWStat:show()

   j:= 6
   FOR i:= 0 TO nDraw STEP nDraw/20
       oWStat:setCaption("Xooooo")
       sleep(j)
       oWStat:setCaption("oXoooo")
       sleep(j)
       oWStat:setCaption("ooXooo")
       sleep(j)
       oWStat:setCaption("oooXoo")
       sleep(j)
       oWStat:setCaption("ooooXo")
       sleep(j)
       oWStat:setCaption("oooooX")
       sleep(j)
       oWStat:setCaption("                     ")
       oWStat:invalidaterect()
       oWStat:setPos( {i,0},.T.)
       oWStat:invalidaterect()
       IF i%40 == 0 .AND. !(j==1)
          j--
       ENDIF
   NEXT i
   oWStat:Destroy()

ENDIF

RETURN

*
* EOF
*
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jimmy,
ich habe Dein Programm gerade mal ausprobiert - ich sehe da keinen Unterschied zwischen "rennen lassen" und "Knopf klicken"
Bedenke bitte, dass Dein Thread auch automatisch alle 10 Sekunden gestartet wird - auch wenn Du auf den Knopf klickst!
Wenn Du also um 10:49:48 auf den Knopf drückst, kommt zwei Sekunden später nochmal der Wurm. Dadurch sieht es für Dich vielleicht so aus, als ob es anders wäre?
Klicke doch mal zu einer Zeit mit x5 Sekunden auf den Knopf (also z.B. 10:41:15) - dann sieht es in beiden Fällen gleich aus!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

Ich habe 120 DPI Bildschirmschriften und bei mir sehe ich ein großes Flackern. Machmal habe ich den Eindruck es flackert 2 oder 3 mal über den Bildschirm, manchmal nur einmal.

Ist es das was du meinst ?
Hast du einen gleichmäßigen Verlauf wie bei einer Raupe oder flackert es bei dir auch ?
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: Machmal habe ich den Eindruck es flackert 2 oder 3 mal über den Bildschirm, manchmal nur einmal.

Ist es das was du meinst ?
Hast du einen gleichmäßigen Verlauf wie bei einer Raupe oder flackert es bei dir auch ?
yup, genau das hab ich gemeint. nun hab ich es gefunden :

Code: Alles auswählen

  nZahl := 0 
  lWorm := .F.
der "flag" wird an der "falschen" Stelle gesetzt. Es muss nach dem
oWStat:Destroy() gesetzt werden

Code: Alles auswählen

   oWStat:Destroy() 
   lWorm := .F.
und dann läuft es schon gleichmässig über den Bildschirm.

... nun hab ich den "Wurm" in meiner Anwendung ...

danke, gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

na ja bei mir flackert es immer noch ziemlich.

Allerdings will ich ja auch keinen Wurm in meinen Anwendungen, da ist es nicht so schlimm :D
Gruß
Hubert
Antworten