Do While Schleife über Pushbutton abbrechen

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

wieder was,

wie kann ich eine Do While Schleife mit einem Pushbutton-Klick abbrechen?

Ich habe eine Do While Schleife, in der Daten in eine DB geschaufelt werden. Jetzt möchte ich diese Vorgang mittels eines Pushbuttons abbrechen. Der Pushbutton reagiert aber nicht. Wie kriege ich den dazu, dass der auf einen Mausklick reagiert?
Zuletzt geändert von Manfred am Mo, 15. Jun 2009 18:40, insgesamt 2-mal geändert.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Martin Altmann »

Manfred,
die DO WHILE (oder den Dialog) in einem extra Thread() laufen lassen, bei Klick eine Abbruchbedingung setzen.

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

Da habe ich mich deshalb von fern gehalten bisher, weil ich nicht verstehe, wie ich dem Thread die schon geöffneten DB übergeben kann.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Martin Altmann »

Wozu das?
Du hast eine Do while nach folgendem Schema (im Prinzip):

Code: Alles auswählen

lAbbruch := .F.
DO WHILE .NOT. ( cDB->( EOF() ) .or. lAbbruch )
...
dann musst Du in dem Thread, in dem Dein Dialogfenster mit dem PushButton liegt, beim Klicken nur die gloable Variable lAbbruch auf .T. setzen!
Es geht natürlich auch eleganter - mit zwei getrennten Threads, bei denen Du dann aus dem einen heraus beim Klicken auf den Button den anderen beendest...

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

ach so,

ich dachte ich sollte die ganze Schleife samt Db usw.in einen Thread legen. Ich habe mir schon Dbrelease() und Dbrequest() durchgelesen, konnte aber nicht wirklich was damit anfangen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Martin Altmann »

Nun,
wenn beides in einem Thread laufen würde, würde die DO WHILE ja den Eventhandler blocken...

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

was ist denn hier dran verbesserungswürdig?

ich weiß jetzt gar nicht, wie ich den Thread schließen muß

Code: Alles auswählen

********************************************************************************
FUNCTION suchen(oBrowse,cWoher)
         LOCAL lErfolg := .T.
         LOCAL nZeichenLaenge

         LOCAL oThread

         MEMVAR lAbbruch
         MEMVAR oGenre
         MEMVAR oKdinfotemp
         MEMVAR oMessage
         MEMVAR oSysteme
         MEMVAR oVo
         MEMVAR oVostamm

         lAbbruch := .F.

         IF Empty(oVostamm:oV_Darstell:editbuffer()) .AND. Empty(oVostamm:oV_titel:editbuffer())
            RETURN(.F.)
         ENDIF
         SetAppFocus(oBrowse)
         oKdInfoTemp:schliesse_datenbank()
         oKdinfotemp:db_oeffnen(,,.T.)                                          // immer vorher leer machen
         IF Upper(cWoher) == "V_DARSTELL"
            oVostamm:indexfocus("darst")
            nZeichenLaenge := Len(oVostamm:oV_Darstell:editbuffer()) + 1
            oVostamm:oV_Darstell:setMarked( {1,nZeichenLaenge} )
            (oVostamm:nArea)->(DbSetScope(SCOPE_TOP,Upper(oVostamm:oV_Darstell:editbuffer())))
            (oVostamm:nArea)->(DbSetScope(SCOPE_BOTTOM,Trim(Upper(oVostamm:oV_Darstell:editbuffer()))))
         ELSE
            oVostamm:indexfocus("titel")
            nZeichenLaenge := Len(oVostamm:oV_titel:editbuffer()) + 1
            oVostamm:oV_titel:setMarked( {1,nZeichenLaenge} )
            (oVostamm:nArea)->(DbSetScope(SCOPE_TOP,Upper(oVostamm:oV_titel:editbuffer())))
            (oVostamm:nArea)->(DbSetScope(SCOPE_BOTTOM,Trim(Upper(oVostamm:oV_titel:editbuffer()))))
         ENDIF
         IF (oVostamm:nArea)->(Eof())
            oMessage:anzeigen("Es wurden keine Einträge gefunden zum Suchbegriff")
            lErfolg := .F.
         ENDIF
         IF lErfolg
            oThread := Thread():new()
            oThread:start("gedrueckt",oThread)
            DO WHILE ! (oVostamm:nArea)->(Eof()) .OR. lAbbruch
               (oVo:nArea)->(DbClearScope())
               (oVo:nArea)->(DbSetScope(SCOPE_BOTH,Str((oVostamm:nArea)->id,8,0)))
               IF ! (oVo:nArea)->(Eof()) .AND. (oVo:nArea)->preissoll > 0 .AND. ! (oVo:nArea)->reserve
                  (oKdInfotemp:nArea)->(DbAppend())
                  (oKdInfotemp:nArea)->v_darstell := (oVostamm:nArea)->v_darstell
                  (oKdInfotemp:nArea)->v_titel    := (oVostamm:nArea)->v_titel
                  (oKdInfotemp:nArea)->vkpreis    := (oVo:nArea)->preissoll
                  (oKdInfotemp:nArea)->genre      := (oGenre:nArea)->bez
                  (oKdInfotemp:nArea)->lagernr    := (oVo:nArea)->lagernr
                  (oKdinfoTemp:nArea)->(DbGoTop())
                  oBrowse:refreshAll()
               ENDIF
               (oVostamm:nArea)->(DbSkip())
            ENDD
         ENDIF
         (oVostamm:nArea)->(DbClearScope())
         RETURN(.T.)
********************************************************************************
FUNCTION gedrueckt(oThread)
         LOCAL nEvent := 0
         LOCAL mp1    := 0
         LOCAL mp2    := 0

         LOCAL oDialog := XbpDialog():new(,,{500,500},{300,300})
         LOCAL oPb
         LOCAL oXbp   := NIL

         MEMVAR lAbbruch

         oDialog:create()
         oPb := XbpPushButton():new(oDialog,,{10,10},{200,30})
         oPb:activate := {|| lAbbruch := .T.,oThread:quit()}
         oPb:caption  := "Abbruch"
         oPb:create()
         DO WHILE ! lAbbruch
            nEvent := AppEvent( @mp1, @mp2, @oXbp)
            oXbp:handleEvent( nEvent, mp1, mp2 )
         ENDDO
         RETURN(.T.)
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Martin Altmann »

Hallo Manfred,
funktioniert das denn so?

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

nee, überhaupt nicht.

:evil:
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

Ja, wohl dem der die Augen auf hat.

so läuft das Grundkonzept

Code: Alles auswählen

********************************************************************************
FUNCTION suchen(oBrowse,cWoher)
         LOCAL lErfolg := .T.
         LOCAL nZeichenLaenge

         LOCAL oThread

         MEMVAR lAbbruch
         MEMVAR oGenre
         MEMVAR oKdinfotemp
         MEMVAR oMessage
         MEMVAR oSysteme
         MEMVAR oVo
         MEMVAR oVostamm

         lAbbruch := .F.

         IF Empty(oVostamm:oV_Darstell:editbuffer()) .AND. Empty(oVostamm:oV_titel:editbuffer())
            RETURN(.F.)
         ENDIF
         SetAppFocus(oBrowse)
         oKdInfoTemp:schliesse_datenbank()
         oKdinfotemp:db_oeffnen(,,.T.)                                          // immer vorher leer machen
         IF Upper(cWoher) == "V_DARSTELL"
            oVostamm:indexfocus("darst")
            nZeichenLaenge := Len(oVostamm:oV_Darstell:editbuffer()) + 1
            oVostamm:oV_Darstell:setMarked( {1,nZeichenLaenge} )
            (oVostamm:nArea)->(DbSetScope(SCOPE_TOP,Upper(oVostamm:oV_Darstell:editbuffer())))
            (oVostamm:nArea)->(DbSetScope(SCOPE_BOTTOM,Trim(Upper(oVostamm:oV_Darstell:editbuffer()))))
         ELSE
            oVostamm:indexfocus("titel")
            nZeichenLaenge := Len(oVostamm:oV_titel:editbuffer()) + 1
            oVostamm:oV_titel:setMarked( {1,nZeichenLaenge} )
            (oVostamm:nArea)->(DbSetScope(SCOPE_TOP,Upper(oVostamm:oV_titel:editbuffer())))
            (oVostamm:nArea)->(DbSetScope(SCOPE_BOTTOM,Trim(Upper(oVostamm:oV_titel:editbuffer()))))
         ENDIF
         IF (oVostamm:nArea)->(Eof())
            oMessage:anzeigen("Es wurden keine Einträge gefunden zum Suchbegriff")
            lErfolg := .F.
         ENDIF
         IF lErfolg
            oThread := Thread():new()
            oThread:start("gedrueckt",oThread)
            DO WHILE ! (oVostamm:nArea)->(Eof()) .AND. ! lAbbruch
               (oVo:nArea)->(DbClearScope())
               (oVo:nArea)->(DbSetScope(SCOPE_BOTH,Str((oVostamm:nArea)->id,8,0)))
               IF ! (oVo:nArea)->(Eof()) .AND. (oVo:nArea)->preissoll > 0 .AND. ! (oVo:nArea)->reserve
                  (oKdInfotemp:nArea)->(DbAppend())
                  (oKdInfotemp:nArea)->v_darstell := (oVostamm:nArea)->v_darstell
                  (oKdInfotemp:nArea)->v_titel    := (oVostamm:nArea)->v_titel
                  (oKdInfotemp:nArea)->vkpreis    := (oVo:nArea)->preissoll
                  (oKdInfotemp:nArea)->genre      := (oGenre:nArea)->bez
                  (oKdInfotemp:nArea)->lagernr    := (oVo:nArea)->lagernr
                  (oKdinfoTemp:nArea)->(DbGoTop())
                  oBrowse:refreshAll()
               ENDIF
               (oVostamm:nArea)->(DbSkip())
            ENDD
         ENDIF
         (oVostamm:nArea)->(DbClearScope())
         RETURN(.T.)
********************************************************************************
FUNCTION gedrueckt(oThread)
         LOCAL nEvent := 0
         LOCAL mp1    := 0
         LOCAL mp2    := 0

         LOCAL oDialog := XbpDialog():new(,,{500,500},{300,300})
         LOCAL oPb
         LOCAL oXbp   := NIL

         MEMVAR lAbbruch

         oDialog:create()
         oPb := XbpPushButton():new(oDialog,,{10,10},{200,30})
         oPb:activate := {|| lAbbruch := .T.}
         oPb:caption  := "Abbruch"
         oPb:create()
         DO WHILE ! lAbbruch
            nEvent := AppEvent( @mp1, @mp2, @oXbp)
            oXbp:handleEvent( nEvent, mp1, mp2 )
         ENDDO
         oDialog:destroy()
         oThread:quit()
         RETURN(.T.)
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

stellt sich mir jetzt nur die Frage, wie kriege ich den Thread gekillt, wenn die Schleife durch ist, aber kein Abbruch gedrückt wurde. Das muß ja auch irgendwie möglich sein. Den Thread mit :quit() darf ich nicht, dann meckert das System
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von AUGE_OHR »

Manfred hat geschrieben:stellt sich mir jetzt nur die Frage, wie kriege ich den Thread gekillt, wenn die Schleife durch ist, aber kein Abbruch gedrückt wurde. Das muß ja auch irgendwie möglich sein. Den Thread mit :quit() darf ich nicht, dann meckert das System
wenn ein Thread "zu Ende" ist dann ist er es auch. Ein :quit oder so wird nicht gebraucht.
gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

Hi,

das war anders gemeint.

Der Thread zeigt einen Button, mit dem abgebrochen werden kann. Wenn der aber nicht benutzt wurde, sondern die Suche beendet ist, dann läuft der Thread doch noch. Dann muß er ja von außen beendet werden. Sonst steht der Button bis Anno Zwieback am Bildschirm
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Martin Altmann »

Hallo Manfred,
Du musst aus Deiner Funktion gedrueckt eine Klasse (von Thread()) machen - und dann das ganze von außen starten und stoppen...

Anbei mal ein Beispiel für einen animierten Cursor:

Code: Alles auswählen

CLASS RunDog FROM Thread
	PROTECTED:
		VAR terminated
    VAR aniAct
	EXPORTED:
		 VAR workCounter

		 INLINE METHOD init
				::Thread:init()
				::terminated  := .F.
				::aniAct := 1010
		 RETURN self

		 INLINE METHOD stop

		 RETURN ( ::terminated := .T. )

		 METHOD execute, checkTermination
ENDCLASS

// Diese Methode wird im Thread ausgeführt
METHOD RunDog:execute

	do while .not. ::terminated
		oApp:setPointer(,::aniAct,XBPWINDOW_POINTERTYPE_ICON)
		::aniAct += 10
		if ::aniAct > 1060
			::aniAct := 1010
		endif
		sleep( 15 )
		::checkTermination()
	enddo
RETURN self

// Diese Methode prüft ob der Thread abgebrochen werden muß
// und terminiert ihn gegebenenfalls

METHOD RunDog:checkTermination
	IF ::terminated
		 ::terminated := .F.
	   oApp:setPointer( , 0, XBPWINDOW_POINTERTYPE_SYSPOINTER )
		 ::quit()
	ENDIF
RETURN self
Aufrufen von aussen tust Du ihn:

Code: Alles auswählen

oRunDog := RunDog():New()
oRunDog:start()
...
oRunDog:stop()
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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

ah,

Beispiel 2. Ok, werde ich mal versuchen
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von AUGE_OHR »

Manfred hat geschrieben:das war anders gemeint.
ich habe mir jetzt mal deinen Source angesehen und verstehe was du meinst

Code: Alles auswählen

oThread := Thread():new()
oThread:start("gedrueckt",oThread)
DO WHILE ! (oVostamm:nArea)->(Eof()) .AND. ! lAbbruch
du ruft also den Thread "vor" der Schleife auf und das ganze als Function ... und das ist dein "grundsätzliches" Problem.

du hast ja z.b. lAbbruch und das in 2 Function, also müsstet du es dem Thread mit als Parameter
per Reference übergeben um für lAbbruch einen Wert zu bekommen.

Code: Alles auswählen

oThread:start("gedrueckt",@lAbbruch)
da nun beide Function in einem PRG sind kannst du alternative auch eine Fieldwide STATIC benutzen.

FUNCTION gedrueckt() hat ja nun eine DO WHILE Loop. Bei einer Fieldwide Static wäre es ja kein
Problem die auf .F. zu setzten und er verlässt die Schleife.

aber was wäre wenn die beiden Function nicht im selben PRG sind ?
NEIN PRIVATE / PUBLIC gibt hier nicht als Lösung !!!

also was in der Function gedrueckt() fehlt ist ein

Code: Alles auswählen

oDialog:close :={|| PostAppEvent(xbeP_Activate,,,oPB)}
dies könntest du dann "von aussen" ansprechen.

an dieser Stelle wäre nun der "nächst" Schritt fällig : mache eine Class daraus.
lAbbruch wäre dann o:lAbbruch und du könntes es von "überall" ansprechen.

man kann ja z.b. bei Objecten ein PostAppEvent() verwenden, also sowas wie
PostAppEvent(xbeP_Keyboard,.F.,,oMyObject) oder mit Userdef

Code: Alles auswählen

#define xbeE_Abbruch     xbeP_User + 1234
PostAppEvent(xbeE_Abbruch,,,oMyObject)
also nimm dir das Beispiel von Martin und "tune" deine Function zu Methode und mache eine Class
daraus dann hast du "solche" Problem in Zukunft nicht mehr.
gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

so, ich habe mal versucht die Sache mit der Threadklasse einzubauen. Aber....

Code: Alles auswählen

         IF lErfolg
            oThread := gedrueckt():new()
            oThread:start()
            DO WHILE ! (oVostamm:nArea)->(Eof()) .AND. ! lAbbruch
               (oVo:nArea)->(DbClearScope())
               (oVo:nArea)->(DbSetScope(SCOPE_BOTH,Str((oVostamm:nArea)->id,8,0)))
               IF ! (oVo:nArea)->(Eof()) .AND. (oVo:nArea)->preissoll > 0 .AND. ! (oVo:nArea)->reserve
                  (oKdInfotemp:nArea)->(DbAppend())
                  (oKdInfotemp:nArea)->v_darstell := (oVostamm:nArea)->v_darstell
                  (oKdInfotemp:nArea)->v_titel    := (oVostamm:nArea)->v_titel
                  (oKdInfotemp:nArea)->vkpreis    := (oVo:nArea)->preissoll
                  (oKdInfotemp:nArea)->genre      := (oGenre:nArea)->bez
                  (oKdInfotemp:nArea)->lagernr    := (oVo:nArea)->lagernr
                  (oKdinfoTemp:nArea)->(DbGoTop())
                  oBrowse:refreshAll()
               ENDIF
               (oVostamm:nArea)->(DbSkip())
            ENDDO
            IF lAbbruch
               oMessage:anzeigen("Die Suche wurde abgebrochen")
            ENDIF
            oThread:terminate()
         ENDIF
         SetAppFocus(oBrowse)
         (oVostamm:nArea)->(DbClearScope())
         RETURN(.T.)
********************************************************************************
CLASS gedrueckt FROM THREAD
      PROTECTED:
      VAR terminated

      EXPORTED:
      INLINE METHOD init
             ::thread:init()
             ::terminated := .F.
      RETURN self

      INLINE METHOD terminate
      RETURN ( ::terminated := .T. )

      METHOD checkTermination
      METHOD execute
ENDCLASS
********************************************************************************
METHOD gedrueckt:execute()
       LOCAL nEvent := 0
       LOCAL mp1    := 0
       LOCAL mp2    := 0

       LOCAL oDialog := XbpDialog():new(,,,{150,120})
       LOCAL oPb
       LOCAL oXbp   := NIL

       MEMVAR lAbbruch

       oDialog:create()
       CenterControl(oDialog)
       oPb := XbpPushButton():new(oDialog,,,{80,30})
       oPb:activate := {|| lAbbruch := .T.}
       oPb:caption  := "Abbruch"
       oPb:create()
       CenterControl(oPb)
       DO WHILE ! lAbbruch
          nEvent := AppEvent( @mp1, @mp2, @oXbp)
          oXbp:handleEvent( nEvent, mp1, mp2 )
          ::checkTermination()
       ENDDO
       oDialog:destroy()
RETURN self
********************************************************************************
METHOD gedrueckt:checkTermination()
       IF ::terminated
          ::terminated := .F.
          ::quit()
       ENDIF
RETURN self
********************************************************************************
der wird nicht fremd beendet. Das kapiere ich irgendwie nicht, wie das klappen soll. Ich habe das Beispiel aus dem Handbuch übernommen und etwas modifiziert.
Die Abbruch Sache klappt über den Pushbutton
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Martin Altmann »

Hmmm - zwei Ideen:
Zum einen hast Du keinen Timeout in Deiner Schleife in dem Thread (ich meine bei AppEvent(...) ) und zum anderen hast Du lAbbruch als Schleifenbedingung genommen - da sollte aber .not. ::terminated rein...

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

ok,

das mit dem lAbbruch habe ich verstanden, habe ich übersehen. Aber das mit dem Timeout, das verstehe ich noch nicht, der soll doch theoretisch endlos laufen. Wird also entweder nur durch fertig (durch Schleife), oder abbruch (durch User) beendet.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Martin Altmann »

Äh, Manfred - ich meinte den vierten Parameter bei AppEvent()...
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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

:thumbright:

prima, Danke, das war es.

So scheint es jetzt zu klappen. Das ist also das Prinzip für mehr oder weniger alle Threads, die man bauen möchte, oder muß? Eigentlich auf den 1.Blick recht einfach. (Wenn man weiß, wie es geht)
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

Martin,

das hatte ich schon probiert. So wie ich es verstanden habe, wird eine Zahl angegeben?

Dann kommt die Fehlermeldung:

Base/2266
Empfänger der Nachricht ist kein Objekt
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Martin Altmann »

?? Wo kommt die Meldung wann??

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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21199
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Manfred »

sobald der Thread angestossen wird und die Eventschleife loslegt
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Do While Schleife über Pushbutton abbrechen

Beitrag von Martin Altmann »

Genauer!
WIe lautet die Zeile (bzw. was steht in der betreffenden Zeile)?

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.
Antworten