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 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.