Re: Probleme mit HWCOM - Fehler gefunden Kategorie: Programmierung (von André H. - 27.11.2003 23:54) | |
Als Antwort auf Re: Probleme mit HWCOM - Fehler gefunden von Georg Mallebrein - 17.11.2003 23:53
| |
Hallo Georg, Zuerst Sorry für die späte Antwort. > Und trotzdem bringt mich Deine Aussage zum „quit -1“ zum > Nachdenken: > ... > ... > Ein entsprechender Hinweis, dass bei mehreren Threads eben die strenge > Ablaufreihenfolge im Code durcheinander kommt, wäre > vielleicht noch eine gute Ergänzung in Deinem so guten Buch > zur C-Control II. Auch im Conrad-Manual wird nicht explizit > darauf hingewiesen. So ein „Negativ-Beispiel“ wie mein Test-Programm > lässt einem die Sache dann besser verstehen. Das ist ja gerade das, was Multithreading ausmacht. Die Threads laufen unabhängig voneinander. Ansonsten wäre es kein Multithreading. :-) > Wie kann ich das Betriebssystem "disziplinieren" einen > Thread vollständig durchlaufen zu lassen, natürlich auf Kosten > anderer ? Muss ich dass mit der Synchronisation mit z.B. „wait free“ > machen, wie im Conrad-Manual aufgeführt? Nein. Du hast eben das gesamte Programm und nicht nur den einen Thread mit quit angehalten. Stell' Dir einmal folgendes vor: Du hast 3 Räder - nennen wie Sie "main", "a" und "b". Das Rad "main" fangt beim "Programmstart" von selbst an zu drehen. Dieses Rad löst bei bestimmten Positionen (z.B. 5° von der Startposition entfernt) das Drehen von Rad "a" und anschlieÃ?end von Rad "b" aus. Das wäre dann sozusagen folgendes: thread main {//Startposition ... run a; // Das wären die "5°" run b; ... } Mit halt kannst Du nun bestimmte Räder anhalten. (Bei der Impliziten Form den thread, in dem "halt;" steht, bei der expliziten Form den angegebenen Thread, egal, wo dieser steht.) Mit quit hälst Du alle Räder sofort an, egal wo sie gerade stehen. > Wie kann ich das Programmverhalten bei zeitlich kritischen Dingen > voraussehen? Das geht theoretisch nur, wenn Du die VM-Codes mit zählst, weiÃ?t wie lange eine VM-Instruktion dauert usw. Wenn jedoch auf "externe" Ereignisse gewartet werden muÃ?, z.B. reicht hier schon ein wait hwcom.ready(), ist dies unmöglich. Eigentlich geht das nur bei sehr einfachen Programmen, möglichst ohne sleep und wait. (Was aber eigentlich nicht möglich ist.) Allerdings sollte dies unwichtig sein, da ein Multithreading-Programm immer so aufgebaut sein sollte, daÃ? sich die Threads nicht gegenseitig blockieren, wenn dies nicht beabsichtigt ist. Ein beabsichtigtes Blockieren wäre z.B. ein Capture, das jedoch in erster Linie dazu dient Resourcen (Hard-und/oder Software) vor "gleichzeitigem Zugriff zu schützen". In zweiter Linie dient ein Capture auch dazu Threads zu Syncronisieren. Beides hat aber miteinander sehr viel gemeinsam, so daÃ? man bei Captures generell von Syncronisieren von Thread sprechen kann. > In Deinem Buch zur C-Controll II gehst Du nur kurz darauf ein. Zuerst: Es ist nicht "mein Buch", sondern ich habe einen Teil dazu beigesteuert. :-) Den Löwenanteil hat B.Kainka geschrieben. U.a. auch den Teil mit dem Multithreading. Ich will schlieÃ?lich nicht alle Lorbeeren für das Buch ernten, wenn B.Kainka auch einige(über die Hälfte) zustehen. :-) > Ich kann die Anzahl der ununterbrochenen virtuellen Befehle durch > die Prio verändern, das habe ich aus dem Buch gelernt. Das stimmt. Auch nehmen aber sleep und wait darauf EinfluÃ?, da ein sleep immer die Rechenzeit an den nächsten Thread abgibt und wait, wenn die Bedingung False ist. (Und yield ist vergleichbar mit einem sleep 0. Oder eben umgekehrt - wie man's eben sieht :-) ) > > Eine Antwort ist nicht dringend bzw. ich werde auch selber nachforschen > um die Sache ganz zu verstehen. Das beste ist, am Anfang einfach ein wenig mit einfachen Programmen rumzuprobieren, um zu testen, wie sich Programme bei verschiedenen Prios verhalten. Als Beispiel könnte man z.B. folgendes machen: long c1,c2,c3; thread a { run 50; loop { c1=c1+1; } } thread b { run 100; loop { c2=c2+1; } } thread c { run 200; loop { c3=c3+1; } } thread main { run a; run b; run c; sleep 2000; halt a; halt b; halt c; hwcom.init(); hwcom.setspeed(8); hwcom.clr(); hwcom.num(c1); hwcom.ret(); hwcom.num(c2); hwcom.ret(); hwcom.num(c3); quit 1; } MfG André H. Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | |
Antwort schreiben Antworten: Re: Probleme mit HWCOM - Fehler gefunden (von Georg Mallebrein - 1.12.2003 20:03) |