Re: run, halt austauschen Kategorie: Programmierung (von Lorenz - 8.12.2011 16:17) | ||
Als Antwort auf Re: run, halt austauschen von André H. - 6.12.2011 21:04 | ||
| ||
Hallo André Viele Dank für die ausführliche Antwort. Da sieht man den Spezialisten der C-contol II. Die Lösung 2 ist eine intressante Möglichkeit. Ich werde zuerst mit einer Weiche probieren. Für mich als Leihe einfacher. Mfg Lorenz aus Südtirol > 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 | ||
Antwort schreiben Antworten: |