Thread quit/Restart iVar ?

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

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

Thread quit/Restart iVar ?

Beitrag von AUGE_OHR »

hi,

ich habe für die Slot Machine eine Class FROM Thread entwickelt. Damit stelle ich die "Walzen" dar.

Das funktioniert auch im Prinzip, aber leider gibt es (ab und zu) mit der 1st Walze ein Problem bei "Restart" ... nicht mit der 2nd oder 3th oder ...
------------------------------------------------------------------------------
FEHLERPROTOKOLL von "D:\ALASKA\SLOT\SLOT.EXE" Datum: 08.06.10 18:23:01

Xbase++ Version : Xbase++ (R) Version 1.90.355
Betriebssystem : Windows XP 05.01 Build 02600 Service Pack 3
------------------------------------------------------------------------------
oError:args :
-> VALTYPE: A VALUE: {10, 8, 5, 6, 9, 1, 4, 11, 2, 7, 3}
-> VALTYPE: N VALUE: 0
oError:canDefault : N
oError:canRetry : N
oError:canSubstitute: J
oError:cargo : NIL
oError:description : Fehler bei der Arrayindizierung
oError:filename :
oError:genCode : 4
oError:operation : <A of 11>[<0>]
oError:osCode : 0
oError:severity : 2
oError:subCode : 1012
oError:subSystem : BASE
oError:thread : 3
oError:tries : 0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von SLOTROLL:SCHIEBER(402)
Aufgerufen von SLOTROLL:BROROLL(317)
Aufgerufen von SLOTROLL:EXECUTE(280)
so, so ... der Array Index soll also 0 sein ...

Code: Alles auswählen

METHOD SlotRoll:Schieber()
LOCAL xxx

*  ARemove(::aSchieber,1)
   // statt ARemove(), hier in Einzelschritten
   ::aSchieber[1] := ::aSchieber[2]
   ::aSchieber[2] := ::aSchieber[3]

   // das ist der Array Index <> 0
   ::nZahlLast++
   IF ::nZahlLast > MAXICON
      ::nZahlLast := 1
   ENDIF
   // statt AADD() direkte Zuweisung
*  AADD(::aSchieber, ::nZahlLast )
   ::aSchieber[3] := ::nZahlLast

   xxx := ::aZahl[::aSchieber[1]]                // kann nicht 0 werden ?
   ::oFeld11:SetCaption(::aArray[xxx])        // knallt hier mit 0 bei restart

   xxx := ::aZahl[::aSchieber[2]]
   ::oFeld12:SetCaption(::aArray[xxx])

   xxx := ::aZahl[::aSchieber[3]]
   ::oFeld13:SetCaption(::aArray[xxx])

RETURN self
nun sieht man aber das ::nZahlLast nicht 0 werden kann und Init() ist mit 1 ... hm :-k
meine Restart sieht so aus

Code: Alles auswählen

CASE nEvent = xbeE_Start

IF oLever:lallow
   IF nDeposit > 0
      // Hintergrund wechseln
      ChangeBack(aBackground,oDlg,.T.)
      
      // ist noch Money vorhanden ? 
      HaveMoney(oCoin,nDeposit)
      nCoin := oCoin:getData()
      nDeposit := nDeposit-nCoin
      oCoin:disable()
      oDeposit:Setcaption( LTRIM(STR(nDeposit)) )

      // weiter Action vermeiden 
      lDoOnce  := .T.

      // Anzeige zurück setzten
      IF nGewin  > 0
         aGewin[nGewin]:setPresParam(aSayPres)
         aGewin[nGewin]:setPresParam(aPbPres)
         nGewin := 0
      ENDIF

      // Hebel ( Level) des "einarmigen Bandit "
      oLever:Animate(mp1)

      // Kontroll Anzeige
      aWin[1] := aWin[2] := aWin[3] := 0
      bWin[1] := bWin[2] := bWin[3] := 0
      cWin[1] := cWin[2] := cWin[3] := 0
      SayLine(oLine1,oLine2,oLine3,aWin,bWin,cWin)

      // Walzen Restarten 
      i := 1
      FOR i := 1 TO LEN(aWalzen)
         aWalzen[i]:Restart()
         SLEEP( RandomInt( 1,100 ) )
      NEXT
   ELSE
      MSGBOX("no Deposit")
      QUIT
   ENDIF
ENDIF
und das passiert im Thread

Code: Alles auswählen

METHOD SlotRoll:ReStart()
IF ::lTakeOff
   ::lStopNow     := .F.
   ::terminated   := .F.
   ::workCounter  := 0
*   ::nZahlLast    := 1
*   ::aSchieber    := {1,1,1}
   ::setInterval( ::BroZufall() )
   ::start()
ENDIF
klar wenn ich die in der Restart Methode ::nZahlLast nochmal "fülle" wäre sie auch "da", aber ich will ja das er dort "weitermacht" wo er aufgehört hat.
hier noch die :execute Methode

Code: Alles auswählen

METHOD SlotRoll:execute
LOCAL iMax := RandomInt( 50, 60 )
IF ::lTakeOff
   ::lTakeOff    := .F.

   DO WHILE ::workCounter < iMax
      // Programmcode für den Thread
      ::workCounter++

      IF ::terminated
         EXIT
      ELSE
         SLEEP( ::BroZufall() )
         ::BroRoll()                   // hier geht es zum "Schieber"
      ENDIF

      IF ((::workCounter) % 20 ) == 0
         ::setInterval( NIL )
         SLEEP(0)
         ::setInterval( ::BroZufall() )
         ::oPbStop:Setcaption( ::aRes[2] )
         ::lStopNow  := .T.
      ENDIF
   ENDDO
   ::oPbStop:Setcaption( ::aRes[1] )
   ::terminated  := .F.
   ::lStopNow     := .F.
   IF ::MyEvent <> NIL
      PostAppEvent(::MyEvent              ,;
                   ::aSchieber            ,;
                   ::RetArray()           ,;
                   HX_LastDialog(::MyHome) )
   ENDIF
   ::setInterval( NIL )
   ::quit()
ENDIF
RETURN self
alle iVar wie ::nZahlLast sind übrigens PROTECTED:

jemand eine Idee was ich "falsch" mache ? warum immer nur die 1st Walze und nicht die 2nd oder 3th ?
gruss by OHR
Jimmy
Antworten