PRIVATE & Threads

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten

Die Lösung

Umfrage endete am Fr, 25. Jan 2008 20:57

ist mir bekannt
5
83%
ist mir unbekannt
0
Keine Stimmen
Ich verstehe das Problem nicht
0
Keine Stimmen
Ich habe noch nicht mit Threads gearbeitet
1
17%
 
Insgesamt abgegebene Stimmen: 6

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

PRIVATE & Threads

Beitrag 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
Zuletzt geändert von AUGE_OHR am Di, 15. Jan 2008 21:47, insgesamt 1-mal geändert.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9356
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag 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:
Herzlich,
Tom
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,
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
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 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 ;-) ?
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: 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
Antworten