Seite 1 von 1

PRIVATE & Threads

Verfasst: Di, 15. Jan 2008 20:57
von AUGE_OHR
hi,

Die Beitrag ist für Fortgeschrittene Xbase++ User gedacht !

Code: Alles auswählen

PROCEDURE Main
PRIVAT zPATH := LEFT( AppName( .t. ),;
                          LEN( AppName( .t. ) ) - LEN( AppName( .f. ) ) )

//
// in einem andern PRG (!)
//

STATIC lCreThread := .F.
MEMVAR zPATH

PROCEDURE BildShow(oBrowse,cArtnr)
LOCAL oThBild
   IF lCreThread
   ELSE
      MSGBOX(zPath)                    // 1.)
      oThBild := Thread() :new()
      oThBild:start( "ThreadBild", oBrowse, cArtnr ... )
      //
      // Hold This Thread !!!
      //
      SLEEP(20)
      DO WHILE lCreThread
         SLEEP(10)
      ENDDO
   ENDIF
RETURN

PROCEDURE ThreadBild(oBrowse,cArtnr,...)
   lCreThread := .T. 
   MSGBOX(zPath)         // 2.)
   lCreThread := .F. 
RETURN
so was passiert jetzt bei 2.) MSGBOX() ?

gruss by OHR
Jimmy

Verfasst: Di, 15. Jan 2008 21:09
von Tom
MEMVAR kommt PRIVATE gleich, zPath wird also im zweiten PRG überladen. Da ihr kein Wert zugewiesen ist, dürfte MSGBOX() crashen. Oder ich bin heute total verpeilt. Möglich. :wink:

Verfasst: Di, 15. Jan 2008 21:50
von AUGE_OHR
hi,
Tom hat geschrieben: MEMVAR kommt PRIVATE gleich, zPath wird also im zweiten PRG überladen. Da ihr kein Wert zugewiesen ist, dürfte MSGBOX() crashen. Oder ich bin heute total verpeilt. Möglich. :wink:
mit dieser Antwort hatte ich allerdings nicht gerechnet ...

ok ich habe jetzt 2x Msgbox() eingebaut, also was passiert bei den
beiden ?

gruss by OHR
Jimmy

Verfasst: Di, 15. Jan 2008 23:35
von brandelh
Hallo Jimmy,

die Antwort ist nicht ganz eindeutig zu erkennen.

zPath ist immer eine privat, da diese in keiner Funktion als LOCAL definiert wurde und somit der Standard gilt.

Ob es in 1. die gleiche Variable wie im MAIN ist, hängt davon ab ob MAIN die funktion BildShow() aufruft, dann wird nämlich die privat mit übergeben, ansonsten nicht.

Bei der 2. ist klar, dass zwar ein Aufruf stattfindet, aber in einem eigenen Thread. PRIVAT sind Threadlocal, somit knallt es in der 2. MsgBox.

Das ist je die Methode die Alaska Clipper S87 Programmierern bei der Migration schmackhaft machen will '... nimm Threads und du kannst deine privat behalten'. Davon halte ich nicht viel, denn mehrere Threads sind für Erfahrene Xbase++ler sicher kein Problem und werden auch gut unterstützt, aber ein Clipper S87 Programm hat erstens eine Aufarbeitung bitter nötig und zweitens sind die mit Threads und manchen 'speziellen' Situationen dadurch (Reihenfolge der Ausführung etc.) überfordert.
Insbesondere, wenn die Nebenwirkungen von private nicht unerwünscht waren ;-)

Trifft diese Antwort deine Erwartungen ;-) ?

Verfasst: Di, 15. Jan 2008 23:52
von AUGE_OHR
hi,
brandelh hat geschrieben: Bei der 2. ist klar, dass zwar ein Aufruf stattfindet, aber in einem eigenen
Thread. PRIVAT sind Threadlocal, somit knallt es in der 2. MsgBox.

Trifft diese Antwort deine Erwartungen ;-) ?
und wieder hat der Kandidat 100 Punkte.

Scheinbar werden "Fortgeschrittene" Fragen hier im Forum schneller
beantwortet als "Cl*pper Umsteiger" Fragen.

gruss by OHR
Jimmy