From 8d6cb19e3ffb90309ef4fc137f67db2fc8e6cd74 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Fri, 16 Nov 2018 18:18:33 +0100 Subject: [PATCH] Global-Layer-Renaming: fix handling of GuiResources in the build the new structure causes them now to be installed into $TARGET/stage which is simply not what I want. I still consider $TARGET/gui the better choice, since an administrator or packager is not aware of our layer namings. The existing solution was half baked anyway, it did not really replicate the source tree. On the other hand, I want to retain the location of the CSS files within the GUI tree, since I consider it a good practice, to keep "code-like" resources with the actual code, and not far away in some arcane "data" directory. No I've noticed, that the env.GuiResource() function is only used once, for this very task. So, for the time being, we can keep it simple and deditaced to that task, i.e we pick up all CSS files we find and install it into a single target directory. NOTE: this issue has brought to my attention two further, completely unrelated issues * Ticket #1192 (Lumiera hangs on failed GUI start) * The ProcDispatcher does an idle wait, due to an error in timed-wait implementation --- SConstruct | 6 +- admin/scons/Buildhelper.py | 14 +- admin/scons/LumieraEnvironment.py | 10 +- admin/scons/Setup.py | 6 +- data/config/setup.ini | 4 +- src/SConscript | 15 +- wiki/thinkPad.ichthyo.mm | 798 +++++++++++++++++++++--------- 7 files changed, 606 insertions(+), 247 deletions(-) diff --git a/SConstruct b/SConstruct index 16fda2d2f..dba344dc0 100644 --- a/SConstruct +++ b/SConstruct @@ -28,11 +28,11 @@ # Read more about the SCons build system at: http://www.scons.org -# SCons plugins and extension modules -#------------------------------------------------ +# NOTE: Lumiera SCons extension modules and plugins +#-------------------------------------------------- import sys sys.path.append('./admin/scons') -#------------------------------------------------ +#-------------------------------------------------- import Setup diff --git a/admin/scons/Buildhelper.py b/admin/scons/Buildhelper.py index 2c54a2f50..78733e246 100644 --- a/admin/scons/Buildhelper.py +++ b/admin/scons/Buildhelper.py @@ -63,8 +63,7 @@ def scanSubtree(roots, patterns=SRCPATTERNS): """ for root in globRootdirs(roots): for (d,_,files) in os.walk(root): - if d.startswith('./'): - d = d[2:] + d = stripPrefix(d, './') for p in patterns: for f in fnmatch.filter(files, p): yield os.path.join(d,f) @@ -136,15 +135,20 @@ def getDirname (d, basePrefix=None): d,_ = os.path.split(d) if basePrefix: basePrefix = os.path.realpath(basePrefix) - name = str(d) - if str(d).startswith(basePrefix): - name = name[len(basePrefix):] + name = stripPrefix(str(d), basePrefix) else: _, name = os.path.split(d) return name +def stripPrefix(path, prefix): + if path.startswith(prefix): + path = path[len(prefix):] + return path + + + def createPlugins(env, directory, **kw): """ investigate the given source directory to identify all contained source trees. @return: a list of build nodes defining a plugin for each of these source trees. diff --git a/admin/scons/LumieraEnvironment.py b/admin/scons/LumieraEnvironment.py index e59edddd0..e7c29629a 100644 --- a/admin/scons/LumieraEnvironment.py +++ b/admin/scons/LumieraEnvironment.py @@ -157,7 +157,7 @@ def register_LumieraResourceBuilder(env): return (generateTargets, source) def IconResource(env, source): - """Copy icon pixmap to corresponding icon dir. """ + """ copy icon pixmap to corresponding icon dir. """ subdir = getDirname(str(source)) toBuild = env.path.buildIcon+subdir toInstall = env.path.installIcon+subdir @@ -165,9 +165,11 @@ def register_LumieraResourceBuilder(env): return env.Install(toBuild, source) def GuiResource(env, source): - subdir = getDirname(str(source)) - toBuild = env.path.buildUIRes+subdir - toInstall = env.path.installUIRes+subdir + """ pick up giben source resource and install + them (flat) into the configured target + """ + toBuild = env.path.buildUIRes + toInstall = env.path.installUIRes env.Install (toInstall, source) return env.Install(toBuild, source) diff --git a/admin/scons/Setup.py b/admin/scons/Setup.py index 3e0b15727..510e6b852 100644 --- a/admin/scons/Setup.py +++ b/admin/scons/Setup.py @@ -40,9 +40,9 @@ CUSTOPTFILE = 'custom-options' buildExe = '#$TARGDIR' buildLib = '#$TARGDIR/modules' buildPlug = '#$TARGDIR/modules' -buildIcon = '#$TARGDIR/gui/icons' -buildUIRes = '#$TARGDIR/' -buildConf = '#$TARGDIR/config' +buildIcon = '#$TARGDIR/gui/icons' # for IconResource() and IconRender() +buildUIRes = '#$TARGDIR/gui/' # for GuiResource() +buildConf = '#$TARGDIR/config' # for ConfigData() installExe = '#$DESTDIR/lib/lumiera' installLib = '#$DESTDIR/lib/lumiera/modules' installPlug = '#$DESTDIR/lib/lumiera/modules' diff --git a/data/config/setup.ini b/data/config/setup.ini index bffb29e92..17befa9a2 100644 --- a/data/config/setup.ini +++ b/data/config/setup.ini @@ -20,5 +20,5 @@ copyright = 2007 - 2015 [Gui] #stylesheet = lumiera.css stylesheet = lumiera-light-theme-complement.css -iconpath = $ORIGIN/../../share/lumiera/icons:$ORIGIN/gui/icons:~/.lumiera/icons -resourcepath = $ORIGIN/../../share/lumiera/gui:$ORIGIN/gui +iconpath = $ORIGIN/../../share/lumiera/icons:$ORIGIN/gui/icons +resourcepath = $ORIGIN/../../share/lumiera:$ORIGIN/gui diff --git a/src/SConscript b/src/SConscript index c79759161..747817521 100644 --- a/src/SConscript +++ b/src/SConscript @@ -16,11 +16,12 @@ lApp = env.SharedLibrary('lumieracommon', srcSubtree('common'), addLibs=lLib, lVault = env.SharedLibrary('lumieravault', srcSubtree('vault'), addLibs=lLib+lApp, install=True) lSteam = env.SharedLibrary('lumierasteam', srcSubtree('steam'), addLibs=lLib+lApp+lVault,install=True) -core = lSteam+lVault+lApp+lLib # in reverse dependency order -support_lib = lLib -app_lib = lApp+support_lib -vault_lib = lVault+app_lib -core_lib = core + # in reverse dependency order +core = lSteam+lVault+lApp+lLib # used to build the core application +app_lib = lApp+lLib # use to link against the platform +core_lib = core # use to link against the core application +vault_lib = lVault+app_lib # use to link against the low-level backend +support_lib = lLib # use to link against the support lib only lumiera = ( env.Program('lumiera', ['lumiera/main.cpp'] + core, install=True) + config @@ -40,9 +41,11 @@ envGtk = env.Clone() envGtk.mergeConf(['gtkmm-3.0','sigc++-2.0','gthread-2.0','cairomm-1.0','gdl','xv','x11','xext','sm']) guimodule = envGtk.LumieraPlugin('gtk_gui', srcSubtree('stage') + core, install=True) +resources = ( [env.GuiResource(f) for f in scanSubtree('stage', ['*.css'])] # note: collected into one target dir + ) gui = ( guimodule + + resources + icons - + [env.GuiResource(f) for f in env.Glob('stage/*.css')] ) diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 3f2a48a80..6e4ef6083 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -79,8 +79,8 @@ - - + + @@ -91,7 +91,7 @@ - + @@ -116,7 +116,7 @@ - + @@ -134,13 +134,14 @@ - + + - + @@ -159,10 +160,11 @@ Ganz anders Model::Tangible: dieses registriert sich bei der Konstruktion

-
+ +
- + @@ -175,7 +177,8 @@ aber so herum macht es mehr Sinn

-
+ +
@@ -199,7 +202,7 @@ - + @@ -228,7 +231,8 @@ BusTerm, das damit Nachrichten an den Nexus schicken kann.

-
+ +
@@ -239,10 +243,10 @@ - - + + - + @@ -255,7 +259,7 @@ - + @@ -268,9 +272,10 @@ Wartet nur noch auf proof-of-concept (DemoGuiRoundtrip)

-
+ + - + @@ -283,7 +288,8 @@ aber nur via einfacher "uplink"-Verbindung

-
+ +
@@ -363,11 +369,11 @@ - + - + @@ -386,7 +392,8 @@ Term-Signal nicht ausgesendet würde.

-
+ +
@@ -399,9 +406,9 @@ - + - + @@ -419,6 +426,11 @@ + + + + + @@ -454,7 +466,7 @@ - + @@ -473,9 +485,10 @@ Anmerkung: ein "frestehendes" BusTerm ist valide und zugelassen, es hat halt nur eine uplink-Connection.

-
+ +
- + @@ -488,7 +501,8 @@ es muß dazu auch jede Menge Methoden implementieren.

-
+ +
@@ -598,7 +612,7 @@ - + @@ -617,7 +631,8 @@ Ein zu früher bzw. zu später Aufruf "fällt einfach hinten runter"

-
+ +
@@ -649,7 +664,7 @@
- + @@ -686,7 +701,8 @@ dann kann der Shutdown-Prozeß den Start des GUI überholen.

-
+ +
@@ -3918,7 +3934,7 @@
- + @@ -3931,7 +3947,8 @@ indem wir ein GTK-Signal erzeugen, das das Hauptfenster schließt

-
+ + @@ -4014,7 +4031,7 @@
- + @@ -5378,7 +5395,7 @@ - + @@ -5408,13 +5425,14 @@ - + + - + @@ -5441,7 +5459,8 @@ - + + @@ -5456,7 +5475,7 @@ - + @@ -5466,7 +5485,8 @@ vorbereitete Grundstrukturen für immer wiederkehrende Setups

-
+ + @@ -5661,7 +5681,7 @@ - + @@ -5674,7 +5694,8 @@ Im Zweifelsfall den GTK+ Inspector verwenden!

-
+ +
@@ -5693,7 +5714,7 @@
- + @@ -5703,7 +5724,8 @@ CSS genügt

-
+ +
@@ -5716,7 +5738,7 @@ - + @@ -5751,7 +5773,8 @@ }

-
+ +
@@ -5825,7 +5848,7 @@
- + @@ -5838,10 +5861,11 @@ daß die alte, obsolete Timeline zurückgebaut ist

-
+ +
- + @@ -5857,7 +5881,8 @@ bevor die Notification-Facade geöffnet werden konnte

-
+ +
@@ -5909,7 +5934,7 @@ - + @@ -5940,7 +5965,8 @@ Allerdings habe ich an der Stelle immer noch GTK-Assertions

-
+ +
@@ -5988,7 +6014,7 @@ - + @@ -6016,7 +6042,8 @@ ist, daß Gio::Application sofort auch gleich eine dBus-Verbindung hochfährt.

-
+ +
@@ -16629,7 +16656,7 @@ - + @@ -16645,7 +16672,8 @@ und daher auf "inaktiv" geschaltet ist.

-
+ +
@@ -17035,7 +17063,7 @@ - + @@ -17045,7 +17073,8 @@ ...denn das ist das vereinfachte Setup für "einfache" Applikationen

-
+ +
@@ -17421,7 +17450,7 @@ - + @@ -17431,9 +17460,10 @@ das Diff wird auf den Platzhalter angewendet

-
+ +
- + @@ -17446,7 +17476,8 @@ dann muß dieses automatisch deregistriert werden

-
+ +
@@ -17619,7 +17650,7 @@ - + @@ -17629,9 +17660,10 @@ d.h. das Widget unternimmt selber nichts, und überläßt GTK die Größenbestimmung

-
+ +
- + @@ -17644,9 +17676,10 @@ Und sonst wird er Körper/Hintergrund ausgedehnt

-
+ +
- + @@ -17682,7 +17715,8 @@ Sehr wichtig für die Anzeige von langen Clips und Effekten.

-
+ + @@ -17931,7 +17965,7 @@ - + @@ -17947,7 +17981,8 @@ Details im  TiddlyWiki....

-
+ +
@@ -18155,7 +18190,7 @@ - + @@ -18165,7 +18200,8 @@ ...für die dritte Lösung, die Repräsentation bereits in der Session

-
+ +
@@ -18253,7 +18289,7 @@ - + @@ -18269,9 +18305,10 @@ Implementiert würde sie vom jeweiligen Widget

-
+ +
- + @@ -18299,9 +18336,10 @@ Der Dekorator würde also auf dem TreeMutator sitzen...

-
+ +
- + @@ -18320,9 +18358,10 @@ Daher gibt es die matchSrc-Operation. Effektiv wird die aber nur bei einem Delete aufgerufen...

-
+ +
- + @@ -18343,7 +18382,8 @@ - + + @@ -18421,7 +18461,7 @@ - + @@ -18431,7 +18471,8 @@ d.h. eine LUID

-
+ +
@@ -18464,7 +18505,7 @@ - + @@ -18477,7 +18518,8 @@ Irgend eine BareEntryID genügt

-
+ +
@@ -18488,7 +18530,7 @@ - + @@ -18504,7 +18546,8 @@ Daher sollte eine inkompatible Strukturänderung überhaupt nicht auftreten können

-
+ +
@@ -18546,7 +18589,7 @@ - + @@ -18556,13 +18599,14 @@ ...abstraktes Interface

-
+ + - + @@ -18578,7 +18622,8 @@ um die Bindung herzustellen

-
+ +
@@ -18589,7 +18634,7 @@ - + @@ -18608,7 +18653,8 @@ und erwarten abweichend vom Standard ein vollständiges Skelett im INS-Verb

-
+ + @@ -19318,7 +19364,7 @@ - + @@ -19331,7 +19377,8 @@ so z.B. sein Placement, welches teilweise als Properties des Track abgebildet wird.

-
+ +
@@ -19396,7 +19443,7 @@ - + @@ -19406,7 +19453,8 @@ ...in dem der Timeline body-canvas nämlich liegt

-
+ +
@@ -19503,7 +19551,7 @@ - + @@ -19513,7 +19561,8 @@ ...sie verwenden dann ein LabelWidget zur Darstellung

-
+ +
@@ -19559,7 +19608,7 @@ - + @@ -19569,7 +19618,8 @@ ERR: nexus.hpp:189: worker_3: ~Nexus: Some UI components are still connected to the backbone.

-
+ +
@@ -19634,7 +19684,7 @@ - + @@ -19650,7 +19700,8 @@ Verwende das als Leitgedanke, um das Layout zu entwickeln

-
+ + @@ -20211,6 +20262,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ demnach würde startup sauber beendet, +

+

+ und unmittelbar danach würder der UI-Thread einen +

+

+ emergency-Shutdown initiieren +

+ + +
+ +
+ + + +
+
+
@@ -21007,7 +21112,7 @@ - + @@ -21025,10 +21130,11 @@ - + + - + @@ -21043,7 +21149,8 @@ - + + @@ -21057,7 +21164,7 @@ - + @@ -21082,7 +21189,8 @@ - + + @@ -21224,7 +21332,7 @@ - + @@ -21237,7 +21345,8 @@ where 1 tick unit depends on the current zoom level

-
+ +
@@ -21245,7 +21354,7 @@
- + @@ -21260,12 +21369,13 @@ - + + - + @@ -21287,7 +21397,8 @@ Theoretisch könnte eine Skala auf einer Seite oder auf beiden Seiten limitiert sein....?

-
+ + @@ -21355,7 +21466,7 @@ - + @@ -21374,7 +21485,8 @@ analog zu gui::model::Tangible

-
+ +
@@ -21756,7 +21868,7 @@ - + @@ -21775,7 +21887,8 @@ erfordert bereits Kenntnis der Innereien

-
+ +
@@ -28848,7 +28961,7 @@ - + @@ -28861,11 +28974,12 @@ Implementierung der real-world-Variante fehlt!

-
+ + - + @@ -28881,7 +28995,8 @@ wie Session- und State-Managment, Commands etc.

-
+ +
@@ -34176,7 +34291,7 @@
- + @@ -34197,7 +34312,8 @@ - + + @@ -36549,7 +36665,7 @@ - + @@ -36562,7 +36678,8 @@ Visitor ist entweder void, oder bool

-
+ +
@@ -36572,7 +36689,7 @@ - + @@ -36691,7 +36808,7 @@ - + @@ -36722,7 +36839,8 @@ Denn letzteres ist bei uns eine Grundannahme. Es gibt keine ungefähren Diffs!

-
+ +
@@ -39726,7 +39844,7 @@ - + @@ -39742,14 +39860,15 @@ Ganz prominent fehlt hier also z.B: MIDI

-
+ +
- + @@ -39762,7 +39881,8 @@ die Aufgrund von Klassifikationen automatisch bereits existieren

-
+ +
@@ -40648,7 +40768,7 @@ - + @@ -40658,7 +40778,8 @@ ...also abzüglich Dekoration und Margin

-
+ +
@@ -40667,7 +40788,7 @@ - + @@ -40680,7 +40801,8 @@ sofern das Widget mit entsprechendem Modus eingefügt wurde

-
+ +
@@ -40713,7 +40835,7 @@ - + @@ -40726,7 +40848,8 @@ context->add_class("ohMy");

-
+ + @@ -40805,7 +40928,7 @@ - + @@ -40821,7 +40944,8 @@ oder ist es eine Vererbungs-Hierarchie, wie sie für das CSS-Styling benötigt wird?

-
+ +
@@ -40842,7 +40966,7 @@ - + @@ -40866,7 +40990,8 @@ - + + @@ -41325,7 +41450,7 @@ - + @@ -41338,9 +41463,10 @@ aber macht in etwa die gleichen Operationen

-
+ +
- + @@ -41359,7 +41485,8 @@ Gtk-Main verwendet inzwischen den gleichen Mechanismus

-
+ +
@@ -41644,7 +41771,7 @@
- + @@ -41657,7 +41784,8 @@ ggfs. neu gemapped und invalidiert wird, woraufhin es neu gezeichnet wird

-
+ +
@@ -41689,7 +41817,7 @@ - + @@ -41702,7 +41830,8 @@ Siehe Beschreibung im Beispiel/Tutorial

-
+ +
@@ -41711,7 +41840,7 @@
- + @@ -41724,7 +41853,8 @@ Im Besonderen kann man sich an Signale anderer Widgets anhängen

-
+ + @@ -42079,7 +42209,7 @@ - + @@ -42095,7 +42225,8 @@ und auch ein Signal für Parse-Fehler anschließt

-
+ +
@@ -42122,7 +42253,7 @@ - + @@ -42140,7 +42271,8 @@ Beachte: der Text-Cursor (Marker "insert") hat right gravity

-
+ +
@@ -42215,7 +42347,7 @@ - + @@ -42237,7 +42369,8 @@ The grip is implemented as a GdlDockItemGrip

-
+ +
@@ -42318,7 +42451,7 @@

- + @@ -42328,9 +42461,10 @@ kann eines der Templates im Zyklus vorrübergehend als "incomplete" gelten.

-
+ +
- + @@ -42352,7 +42486,8 @@ Konsequenz: man wählt dann z.B. eine subtil falsche Spezialisierung.

-
+ +
@@ -42378,7 +42513,7 @@ - + @@ -42406,13 +42541,14 @@ selber aus einem statischen Initialisierungs-Kontext heraus erfolgt.

-
+ +
- + @@ -42608,7 +42744,8 @@   }

-
+ +
@@ -42850,7 +42987,7 @@ - + @@ -42875,9 +43012,10 @@ Query<RES>::resolveBy

-
+ +
- + @@ -42912,14 +43050,15 @@ sonst kommt Doxygen durcheinander

-
+ +
- + @@ -42941,7 +43080,8 @@ wird hier kein Link erzeugt

-
+ +
@@ -42957,7 +43097,7 @@ - + @@ -42973,7 +43113,8 @@ Die Icon-Größen ergeben sich aus den Boxes auf 'plate'

-
+ +
@@ -42988,7 +43129,7 @@ - + @@ -42998,7 +43139,8 @@ ...im Besonderen die guten Diagramme für Pulse, ALSA und Jack

-
+ +
@@ -43123,7 +43265,7 @@
- + @@ -43146,10 +43288,11 @@ "-Wl,-rpath-link=target/modules"

-
+ +
- + @@ -43159,14 +43302,15 @@ laufen wieder alle

-
+ + - + @@ -43176,7 +43320,8 @@ test.sh Zeile 138

-
+ +
@@ -43220,7 +43365,7 @@ - + @@ -43230,12 +43375,13 @@ und wir verbringen unsere Zeit mit contention

-
+ +
- + @@ -43245,7 +43391,8 @@ ist klar, hab ich gebrochen

-
+ + @@ -43261,7 +43408,7 @@ - + @@ -43274,7 +43421,8 @@ Vorher hatte ich erste Kollisionen nach 25000 Nummern

-
+ +
@@ -43313,7 +43461,7 @@
- + @@ -43326,7 +43474,8 @@ Aug 10 04:51:39 flaucher kernel: traps: test-suite[8249] trap int3 ip:7ffff7deb241 sp:7fffffffe5c8 error:0

-
+ + @@ -43383,7 +43532,7 @@ - + @@ -43393,7 +43542,8 @@ bison dejagnu flex gobjc libncurses5-dev libreadline-dev liblzma-dev libbabeltrace-dev libbabeltrace-ctf-dev python3-dev

-
+ +
@@ -43409,7 +43559,7 @@ - + @@ -43443,7 +43593,8 @@ au weia LEUTE!

-
+ +
@@ -43467,7 +43618,7 @@
- + @@ -43483,10 +43634,11 @@ und tatsächlich: das ist daneben, GCC hat Recht!

-
+ +
- + @@ -43496,7 +43648,8 @@ aktualisieren und neu bauen

-
+ +
@@ -43516,7 +43669,7 @@ - + @@ -43526,7 +43679,8 @@ wähle Kompatibiltät genau so, daß Ubuntu-Trusty noch unterstützt wird.

-
+ + @@ -43558,9 +43712,162 @@
+ + + + + + + + + + + + + + + +

+ env.GuiResource(f) for f in env.Glob('stage/*.css') +

+ + +
+
+
+ + + + + + + + + + +

+ wenn ich doch mal noch komplexere Bäume transportieren muß +

+ + +
+
+ + + + + + +

+ ich mag code-nahe Resourcen lieber beim Code selber +

+ + +
+ +
+
+ + + + + + + + + + + +

+ aber bei der Implementierung hab' ich dann Pragmatismus walten lassen +

+
    +
  • +  Stichwort: getDirname() +
  • +
  • + effektiv ist das nur eine Ebene tief gestaffelt +
  • +
  • + alles darunter wäre in ein Verzeichnis gekippt worden +
  • +
+ + +
+ +
+
+ + + + + + +

+ +

+

+ weil dann die Builder-Funktion die Quelle nicht mehr findet :-P +

+

+ Dann +

+ + +
+
+ + + +
+ + + + + + + + +

+ nämlich im src/SConscript, wenn es um das GUI geht +

+ + +
+ +
+ + + + + + +

+ und sie war ohnehin schon so geschrieben worden, daß das Endresultat irgendwie paßt +

+ + +
+ +
+ + + + + + + + + + + + +
+
- + @@ -43573,9 +43880,10 @@ Ich meine also: zu Beginn vom Build sollte das Buildsystem einmal eine Infozeile ausgeben

-
+ +
- + @@ -43585,7 +43893,8 @@ ...denn die stören jeweils beim erzeugen eines Hotfix/Patch im Paketbau per dpkg --commit

-
+ +
@@ -43630,7 +43939,7 @@
- + @@ -44019,7 +44328,7 @@ - + @@ -44035,7 +44344,8 @@ bestehen, aber irgendwann müssen wir das schon glattziehen

-
+ +
@@ -44057,8 +44367,8 @@
- - + + @@ -44073,7 +44383,7 @@ - + @@ -44083,7 +44393,8 @@ seit gcc-4.8 ist kein static_assert mehr in der STDlib

-
+ +
@@ -44123,9 +44434,10 @@ - - - + + + + @@ -44171,10 +44483,11 @@ END

-
+ + - + @@ -44184,11 +44497,12 @@ for I in `seq 1 50`; do target/test-suite CallQueue_test; done

-
+ +
- + @@ -44204,7 +44518,8 @@ und eine Doxygen-Seite im Browser geladen

-
+ +
@@ -44225,7 +44540,7 @@ - + @@ -44235,7 +44550,8 @@ weil sich die Threads gegenseitig ihre Counter inkrementieren.

-
+ +
@@ -44247,7 +44563,7 @@ - + @@ -44260,12 +44576,46 @@ verwenden globale Variable oder überhaupt keine Objektfelder

-
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +