Re: run, halt austauschen Kategorie: Programmierung (von André H. - 6.12.2011 21:04) | ||
Als Antwort auf run, halt austauschen von Lorenz - 3.12.2011 15:34 | ||
| ||
Hallo Lorenz, Grundlagen C2: Funktionen können nur Werte und Variablen bzw. Referenzen auf Variablen(Arrays) übergeben werden. Ein Thread ist keines davon. Deshalb kann dies auch nicht übergeben werden. Nun zum Problem: Die Schlüsselworte zur Threadkontrolle erwarten die Threadnummer als Konstante. D.h. diese wird einkompiliert. (siehe vmcodes.c2) Wenn man mit run, halt, resume, reset arbeitet führt daran kein Weg vorbei. Es gibt zwei Möglichkeiten: 1. Du baust Dir eine Weiche. Mit If-Anweisungen wählst Du die entsprechenden Threads aus. 2. Du arbeitest mit einem kleinem Trick. Ich hatte im Zusammenhang mit einem anderem Problem vor langer Zeit eine direktere Möglichkeit der Thread-Kontrolle aufgezeigt: Re: Funktions/Thread-Definitionen vom 11.05.2008 Einziger Nachteil: Du mu�t die Thread-ID in Erfahrung bringen. �ndert sich die Reihenfolge der Threads, anderen sich auch die IDs. Diese werden von Oben nach unten bei 1 beginnend zugewiesen. Der Mainthread (der unterste) hat die höchste ID. Sinnvoll ist es, wenn die Threads Ihre IDs selbst verraten. Dazu müssen alle Threads bei Programmstart kurz anlaufen. z.B.: byte ThreadID[32]; Array für bis zu 32 Threads const Thread_irgendwas=1; const Thread_wasanderes=2; // Der Index hat nichts mit der ID zu tun //dies Dient nur zu leichteren Verwendung. Man kann die IDs natürlich //auch in einzelne Bytevariablen speichern. thread irgendwas { ThreadID[Thread_irgendetwas]=TID(); halt;// Wichtig, wenn der Thread nicht sofort weiterlaufen soll. // Kann entfallen, wenn die ThreadID erst nach dem ersten vorgesehenem run benötigt wird. loop // Eigentlicher Threadinhalt { //... } } thread irgendwas { ThreadID[Thread_wasanderes]=TID(); halt; loop // Eigentlicher Threadinhalt { //... } } Die Threads können dann mit setPrio() beinflu�t werden. Eine Priorität von 0 hei�t, da� der Thread steht. 1 bis 255 hei�t, er soll mit der entsprechenden Prio laufen. Bei dieser Lösung kann weiterhin parallel mit den Schlüsselworten gearbeitet werden. Der Vorteil dieser Lösung ist, da� man nicht den Einschränkungen des Single-Pass-Compilers unterliegt, sondern auch ein weiter oben stehender Thread auch einen weiter unten steuern kann. MfG André H. > > Hallo, > ich möchte gern wissen ob man meinen Code kürzer schreiben kann. > Dieser wäre der untenstehende Code und zwar 5 mal hintereinander geschrieben, > nur dass menu.Ladepumpe_tog durch eine andere Variablen ersetzt wird und dass > der thread ladepumpe.Pumpe durch andere threads gestartet und gehalten wird. > > > thread auto > { > > byte x[5]; > > > loop > { > if menu.Ladepumpe_tog != 0 > { > x[2] = 1 ; > if menu.Ladepumpe_tog == 1 > { > if stports.get(10) == 0 > { > halt ladepumpe.Pumpe; > > stports.set(10,-1) ; > } > > } > else > { > if stports.get(10) != 0 > { > halt ladepumpe.Pumpe; > stports.set(10,0); > } > > } > } > else > { > if x[2] == 1 > { > run ladepumpe.Pumpe; > sleep 1000; > } > x[2] = 0; > } > sleep 1000; > } > > } > > > Ich habe es vesucht so zu lösen wie in diesem Beispiel, aber es hat nicht funktioniert: > > > function update(var myvar, thread mythread) > { > ... > } > > function auto() > { > function update(var1, thread1); > function update(var2, thread2); > function update(var3, thread3); > } > > MfG > Lorenz Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: Re: run, halt austauschen (von Lorenz - 8.12.2011 16:17) |