Thread;Eventloop;übergabe von Ergebnissen anderer 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

Thread;Eventloop;übergabe von Ergebnissen anderer Threads

Beitrag von AUGE_OHR »

hi,

wie fang ich bloss an ...

Code: Alles auswählen

Procedure Main
...
 oMainDlg := XbpDialog(...)
...
// kpl. Browse Fenster als Function
 oWinBro  := myBrowse(oMainDlg)
// OBJ in Array speichern
 AADD(aDLGOWNER,oWinBro)
...
 oMainDlg:Show()
 oWinBro:Show()
 DO WHILE .NOT. lExit
       nEvent := AppEvent( @mp1, @mp2, @oXbp, nTimeout )
      DO CASE
...
      ENDCASE
...
 ENDDO
...
RETURN

Function myBrowse(oParent)
LOCAL aDBF    := {{ "W9MARK"     , 1,"*"       ,"MARK" ,"","" },;
...
   SELECT 5                     
   USE (zPATH+"WM9MARK.DBF") ALIAS WM9MARK SHARED
...
  oDlgBrowse := XbpDialog(oParent:drawingArea,....)
  oBrowse      := GuiBrowseDb( oDlgBrowse:drawingArea,...)
  FOR i   :=1 TO LEN(aDBF)
         IF VALTYPE(aDBF[i,1])=="C"
            oCol:dataLink   := &("{||"+aDBF[i,1]+"}")
*            oCol:dataLink   := FieldWBlock(aDBF[i,1], nSelectNo )
         ELSE
            oCol:dataLink   := aDBF[i,1]
         ENDIF
...
  NEXT
  oBrowse:stableblock   := {|| Ref2Gets(aEditControls) }
...
  oBrowse:show()
//
// KEIN Eventloop sondern OBJ zurück geben
//
  oDlgBrowse:hide()
  oDlgBrowse:cargo := oBrowse
Return oDlgBrowse
soweit sogut. nun will ich aber aus einem 2st Thread ein ":refresh"
auf den oBrowse loslassen ...

Code: Alles auswählen

// in Procedure MAIN
...
CASE nKey = xbeK_F12
      IF aoChild[CH_WMP]:PlayState >= wmppsPaused ....
         PLAYSNIP(oMainDlg,aoChild,aDLGOWNER)
      ENDIF
...
in einem (physikalisch) anderen PRG steht nun

Code: Alles auswählen

STATIC lPlaySnip := .F.

FUNCTION         PLAYSNIP(oMainDlg,aoChild,aDLGOWNER)
LOCAL oPlaySnip
   IF lPlaySnip                    // is fieldwide STATIC
   ELSE
      lPlaySnip := .T.       
      oPlaySnip := Thread():new()
      oPlaySnip:start("PLAYPART",oMainDlg,aoChild,aDLGOWNER)
   ENDIF
RETURN lPlaySnip

PROCEDURE        PLAYPART(oMainDlg,aoChild,aDLGOWNER) 
...
// anderes SELECT !!!
//
   SELECT 1         
//
// es MUSS der selbe ALIAS verwendet werden sonst meckert 
// FieldWBlock obwohl ich es gar nicht verwende
//
   USE (zPATH+"WM9MARK.DBF") ALIAS WM9MARK SHARED
...
   DO WHILE !EOF()
...
         IF aDLGOWNER[DI_DLGMARKER]:isvisible()
            aDLGOWNER[DI_DLGMARKER]:cargo:Refreshall()
         ENDIF
...
        DO WHILE nIstPos < nEndPosi .AND..NOT. lPlayNext
            nEvent := AppEvent( @mp1, @mp2, @oXbp, 5 )
           DO CASE
... 
           ENDCASE
           SLEEP(10)
        ENDDO
        lPlayNext  := .F.
...
        SKIP
        IF aDLGOWNER[DI_DLGMARKER]:isvisible()
           aDLGOWNER[DI_DLGMARKER]:cargo:RefreshCurrent()
        ENDIF
   ENDDO
also ich "schicke" das ":refresh" nicht an den "aktuellen" Thread
und auch nicht an den "aktuellen" Workspace.

obwohl es "optisch" grundsätzlich funktioniert stimmt was nicht,
den ich hab im meinen oBrowse (oDlgBrowse:cargo) mit dem
Keyboard keine Kontrolle (up,down,PgUp,PgDown).

... im Main Thread wird, in SELECT 5 "WM9MARK.DBF", auch noch
der SCOPE gewechselt und er ist gewöhnlich in SELECT 1.

So ich hoffe es einigermassen verständlich gemacht zu haben was
ich wissen möchte wie man das besser/richtig macht.

gruss by OHR
Jimmy
Antworten