Für dieses Forum muß Javascript im Browser aktiviert werden!
Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C2 Quellcode formatieren: <code>Quellcode</code> ASM Quellcode formatieren: <asm>Quellcode</asm> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! > Hallo André! > > Habe mittlerweile meinen Programmcode aufgeräumt. > Mit ist jetzt klar, dass ich bei vielen Standardmodulen kein zusätzliches capture und release einbauen > darf. > > Das Programm funktioniert jetzt auch soweit. > > Danke! > > mfg > > Peter Schmidthaler > > > Hallo Peter, > > > > > Kann mir jemand bei meinem Miniprogramm helfen. > > > unter http://www.jvpstmarien.at/steuerung/index.htm und dann den File threads.zip > > > stehen die Daten. > > > > Dieses kleine Proggie hättest Du auch ohne weiteres posten können. ;-) > > Dann mach ich das: > > <code>byte flag; > > > > thread a > > { > > capture flag; > > data.x = 65; > > lcd.clear(); > > lcd.goto(0,0); > > lcd.put(data.x); > > sleep 2000; > > release; > > > > } > > > > thread b > > { > > capture flag; > > lcd.clear(); > > data.x = 66; > > lcd.goto(0,0); > > lcd.put(data.x); > > sleep 2000; > > release; > > }</code> > > > > > Das ganze soll ein Testaufbau sein, da ich in einem komplexeren Programm Schwierigkeiten habe und > > > deshalb das ganz einmal mit einem Miniprogramm testen will. > > > > > > Das Programm soll abwechselnd A und B am LCD der Unit ausgeben. > > > > > > ACHTUNG: Ich will unbedingt Capture und Release verwenden, da ich diese Befehle wahrscheinlich bei > > > meinem anderen Programm brauche und ich bis jetzt noch nicht damit zu recht komme. > > > > Dein Testprogramm kann so nicht funktionieren, wie Du es willst. > > Es wird hier immer nur ein Thread laufen und der andere ewig auf die Freigabe warten. > > In Deinem Fall wäre das thread a, da dieser zuerst gestartet wurde. > > Um kurz zu erklären, was hier passiert: > > Thread a läuft an und setzt das Capture. > > Thread b wird auch gestartet, aber wartet bei <code>capture flag;</code>, da > > das Flag bereits von Thread a besetzt ist. > > Thread a wird komplett durchlaufen bis zum <code>sleep 1000;</code>. > > Hier wird die Rechenzeit solange abgegeben, bis die 2000ms vorbei sind. > > Thread b wartet prüft inzwischen bei jeder Rechenzeitzuteilung, ob das Flag > > wieder frei ist, gibt aber die Rechenzeit gleich wieder ab, da das Flag noch von Thread a > > besetzt wird. > > Nun sind die 2000ms um, und Thread a kommt zum <code>release;</code> und anschließend > > gleich wieder zum <code>capture flag;</code> am Anfang. > > Da es unmittelbar vor dem Release durch das Sleep zu einem Threadwechsel kam, > > kann der Thread nach dem Sleep wieder 32 VM-Instruktionen ohne Unterbrechung durcharbeiten. > > <code>release;</code> ist eine, dann wären es noch 31. > > <code>capture flag;</code> wäre die zweite. <code>data.x=65</code> zusammen > > die dritte und vierte usw. > > Kurz: Solange es zu keinem Threadwechsel zwischen dem release und capture kommen kann, > > wird der zuerst gestartet Thread immer exklusiv laufen. > > Jetzt gibt es in diesem Beispiel drei Möglichkeiten: > > 1. Du setzt die Prio beider Threads auf 1. (<code>run 1;</code>) > > 2. Du baust nach dem <code>release;</code> ein <code>yield;</code>, um an dieser Stelle > > gezielt die Rechenzeit vorzeitig abzugeben. > > 3. Du baust noch etwas Programmcode nach dem Release oder vor dem Capture ein, sodaß > > dazwischen mindestens soviele VM-Instruktionen ausgeführt werden, wie es mit der Prio > > festgelegt ist. (Bei Standard-Prio wären das 32 VM-Instruktionen) > > > > MfG André H. > >