Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Wichtig: Bevor Du wegen einem Problem mit der CC2 postest, stelle sicher, daß Du
die neueste OS-Version, die neuseste Compiler-DLL und die neuesten Modulversionen benutzt!
Beachte, daß sich auf der CD zur CC2-Unit/Station auch jetzt noch die ältesten Dateien befinden!
Es gelten folgende Anleitung und Regeln: Regeln CC2Net.de-Forum
Zurück zum Artikel  (Blaue Felder sind Pflichtfelder)


Name:   UserID: 
 E-Mail:
Kategorie
Betreff
Homepage:
Link-Titel:
Link-URL:
Cookie für Name, UserID, E-Mail, Homepage-URL setzen
(Erspart die Neueingabe bei Beiträgen und Antworten)
(Zum Löschen des Cookies hier klicken)
Ich nutze:
C-Control II Unit
C164CI-Controllerboard
C-Control II Station
CCRP5 mit CC2-Unit (Conrad Roboter)
CC2-Application-Board
CC2-StarterBoard
CC2-ReglerBoard
eigenes Board
original OS     OSOPT_V2     OSOPT V3.0 OSOPT V3.1

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 Tom, > > Ich gehe einmal aus, daß die Threads von einem weiterem mit run gestartet wurden. > Das wäre auch nicht das Problem. > > Das Problem ist eher, daß ich keinen Sinn  bzw. keine Funktion in diesen > Tests sehe. > > Du hast 4 globale Variablen in den Threads definiert: > a.i, a.j, b.i, b.j > > In der Fuktion sind zwei lokale Variablen definiert: > a und b > > Was ich nirgends sehe ist, wo Werte zugewiesen werden !? > Die Globalen Variablen haben  am Anfang den Wert 0. Daran > ändert sich in diesem Code auch nichts. > Du übergibst aus beiden Thread diese Variablen mit dem Wert 0 > an Variablen a und b die Funktion. diese rechnet dann 0 + 0 > und speichert das Ergebnis 0 in die lokale Variable 0, welche am > Ende der Funktion verworfen wird. > > Ich glaube, daß Dir nicht ganz klar ist, wie lokale Variablen funzen: > Beim Programmstart gibt es keine Variablen a und b. > Diese werden erst beim Aufruf der Funktion einem Speicherbereich "zugewiesen" > und die zu übergebenden Werte in diesen gespeichert. > Ich die Funktion beendet, wird der Speicherbereich der beiden Variablen > wieder freigegeben, also die "Zuweisung" aufgehoben. > Um zum Multithreading zu kommen: > Da die Variablen der Funktion lokal sind, können von dieser beliebig viele > Instanzen aufgerufen werden. Bei jeder Instanz belegen a und b andere > Speicherbereiche. Darum ist es auch möglich, daß sich Funktionen > selbst aufrufen. > > Mehr dazu siehe im CC2(-Unit)-Handbuch ab Kapitel "5.8 Funktionen" ab > Seite 66 und besonders "5.8.2 Parameter und Lokale Variablen" auf Seite 68. > > Daher ist beim Aufruf von Funktionen, bei denen nicht schreibend auf > von mehreren Threads genutzte globale Variablen oder andere gemeinsam > genutzte Recourcen zugegriffen wird, auch kein Capture sinnvoll, da es nicht benötigt wird. > Captures werden nur benötigt, wenn Resourcen geteilt werden, was jedoch > bei deinem Code nicht der Fall ist. Eine Funktion ist keine geteilte Recource. > Geteilte Recourcen wären, wenn mehrere Threads gleichzeitig > Zugriff auf z.B. <b>globale</b> Variablen, Schnittstellen(hwcom,swcom,lpt), > Busse(I²C, CAN), LCD etc. hätten. > Also überall, wo etwas durcheinander kommen könnte. :-) > > Als Beispiel hier der Zugriff von zwei Threads auf ein externes LCD: > <font face="courier new" size=2> > <b>byte</b> flag; > <b>thread</b> a > {<b>byte</b> second; >   //run 16; >   <b>capture</b> flag; >   lcdext.line(1); >   lcdext.zahl2(system.hour()); >   lcdext.put(&#39;:&#39;); >   lcdext.zahl2(system.minute()); >   lcdext.put(&#39;:&#39;); >   lcdext.zahl2(system.second()); >   <b>release;</b> >   second=system.second(); >   <b>wait</b> system.second()!=second; > } > > <b>thread</b> b > {<b>string</b> s; >   //run 16; >   <b>capture</b> flag; >   lcdext.line(2); >   s=""; >   str.putlong(s,system.timer()); >   lcdext.print(s); >   <b>release;</b> >   sleep 10; > } > > <b>thread</b> main > { >   lcdext.init(); >   <b>run</b> a; >   <b>run</b> b; >   <b>wait</b> ports.getHostkey(); >   <b>quit</b> 1; > } > </font> > > Zum Testen, was ungecaptured passiert, kannst Du die Captures entfernen > und die Prio mit run 16 etwas kleiner einstellen. Dann passierts schneller. :-) > > MfG André H. > > > > Variante 1 ------------------------------------------------------------------------------------------ > > > > byte flag1; > > > > function testcapture(int a,int b) > > { > >  a=a+b; > > } > > > > thread a > > { > > int i,j; > >    capture flag1; > >    testcapture(i,j); > >    release; > > } > > > > thread b > > { > > int i,j; > >    capture flag1; > >    testcapture(i,j); > >    release; > > } > >
Dateianhang: (.gif, .png., .jpg, .zip, .rar)
max. 256kB
max. 256kB