Re: Multithreading und allgemeine Programmierung Kategorie: Programmierung C (von Fertelle - 14.01.2012 11:20) | ||
Als Antwort auf Re: Multithreading und allgemeine Programmierung von Franz-Peter - 13.01.2012 17:32 | ||
| ||
> > > > > > P.S - ein kleiner Nachtrag: > > > > > > es macht auch keinen Sinn, in Funktionen �bergabeparameter zu definieren, und die dann am Anfang > > > > > > der Funktion direkt zu überschreiben. Globale Variable kannst Du in der Funktion direkt verwenden, > > > > > > und �bergabeparameter werden beim Aufruf gesetzt. Natürlich kann man die in der Funktion auch > > > > > > ändern, aber wenn man sie nicht als �bergabewerte braucht, sollte man sie auch nicht als Parameter, > > > > > > sondern als lokale Variable definieren. > > > > > > Gru� > > > > > > Franz-Peter > > > > > > > > > > > > > > > Vielen Dank erst mal! > > > > > > > > > > Hab den Code jetzt mal abgeändert und bekomme auch keine Fehler mehr! > > > > > Hab am Montag ein Praktikum wo wir mit threads arbeiten und wollt fragen ob der Code im jetzt soweit > > > > > in Ordnung ist (funktionsfähig) ist. > > > > > Warum kann ich/sollte ich threads nicht solange andauern lassen (1s,2s)? > > > > > Was ich mit den �bergabevariablen erreichen will ist folgendes: Ich übernehme die werte der globalen > > > > > Variablen,wenn der thread wechselt werden diese nicht überschrieben und die globalen Variablen haben die selben > > > > > Werte als am Anfang die ich für die zweite Funktion verwenden kann.Lieg ich richtig?Wie könnt ichs besser machen? > > > > > > > > > > Vielen Dank.Fertelle > > > > > > > > Hallo Fertelle, > > > > natürlich kannst Du im Thread lokale Variablen verwenden, wenn du die globalen Variablen unangetastet > > > > lassen willst (wobei die in deinem Programm ja gar nicht verändert werden - und allein der Thread- > > > > Wechsel ändert sie auch nicht). Nur solltest Du sie dann auch als lokale Variable deklarieren und > > > > nicht als �bergabeparameter. �bergabeparameter gibt es bei einem Thread nun mal nicht. > > > > > > > > Ein Thread ist im Prinzip nichts anderes wie eine 2. (oder 3., 4....) main() Routine, die quasi > > > > parallel zur Haupt main() Routine ausgeführt wird. Wenn Du die Wechselzeiten sehr gro� machst, dann > > > > laufen sie eben nicht 'quasi-parallel' ab, sondern in grossen Zeitscheiben spürbar nacheinander, > > > > was eigentlich nicht der Sinn einer Thread-Implementierung ist. Nur das Thread_Delay verändert > > > > dieses Verhalten noch, denn es führt auch zu einem Thread-Wechsel. > > > > > > > > In der jetzigen Version beendet sich dein main() nach dem letzten Thread_Start (Das Thread_Delay > > > > danach ist deshalb letzendlich wirkungslos). Ich bin mir nicht ganz sicher, ob die anderen Threads > > > > weiterlaufen, wenn sich main() beendet, glaube aber schon. Es ist aber auf jeden Fall eine eher > > > > ungewöhnliche Programmierung, die man normalerweise nicht so realisieren würde. > > > > > > > > N.B: da Du ja nur ein einzelnes Bit im Port setzen/Rücksetzen willst, muss Du auch beim Schreiben > > > > die Bit-Variante der Lib verwenden (Port_WriteBit ). Mit Port_Write() änderst Du alle 8 Bits eines > > > > Byte-Ports auf einmal. > > > > Gru� > > > > Franz-Peter > > > > > > Bei Beendigung (auch Thread_Kill) von Thread 0 (Hauptprogramm) wird die komplette > > > Abarbeitung angehalten. > > > > > > Gruss Peter > > > > Danke, > > so langsam wirds immer klarer! > > hab den Code jetzt mal etwas vereinfacht und nochmals angehängt. > > Wenn ich den Command Thread_Delay verwende spring ich aus meiner Funktion raus und bearbeite die nächste > > Funktion, sehe ich das so richtig? > > Da ich nur threads in meiner Main Funktion habe springe ich auch nur von einem thread zum anderen, da die > > Main ja sonst eigentlich nichts zu tun hat? > > Würde man so programmieren wie ichs jetzt gemacht habe oder zu einfach? > > > > Vielen, vielen Dank. > > > > Fertelle > Hallo Fertelle, > ja, ein Thread wird unterbrochen, wenn Thread_Delay (oder Thread_Wait) aufgerufen wird, oder wenn > sein Laufzeit wie in #thread definiert abgelaufen ist. Dann sucht der Interpreter einen anderen > Thread, der zur Abarbeitung bereit ist und macht dort weiter wo er diesen Thread vorher unterbrochen > hat. Das ist auch bei der Zeit von Thread_Delay zu beachten: Im Gegensatz zu Abs_Delay ist das keine > exakte Zeit, sondern nur eine Mindestzeit. Die tatsächliche Verzögerung kann u.U. wesentlich grösser > sein. Wenn die Zeit abläuft wird ja normalerweise gerade ein anderer Thread bearbeitet, und erst > wenn der unterbrochen wird (aufgrund der Ereignisse oben) kann der wartende Thread wieder aufgenommen > werden. Insbesondere wenn Du die Zeitscheiben sehr gro� machst kann das dementsprechend lange > dauern. > In diesem Sinne ist auch main() nur ein Thread wie alle anderen. Die Verwaltung der Threads findet > nicht in main() statt. Wenn der Aufruf von Thread_Start() in main zurückkommt hat Main() mit der > weiteren Abarbeitung nichts mehr zu tun. Dein main() hat also nach dem Start der Threads eigentlich > garnichts mehr zu tun. Und das ist auch weiterhin das Problem: main() beendet sich, und damit endet > die gesamte Programmbearbeitung. Du musst deiner main-Routine unbedingt etwas zu tun geben - und > wenn es nur eine leere Dauerschleife ist. Das Thread_Delay zwischen den beiden Thread_Start macht > dagegen eigentlich keinen Sinn - oder weshalb hast Du das da eingefügt? > > Gru� > Franz-Peter Hi,ja jetzt wo du es mir sagst, dass thread delay zwischen thread 1 und 2 ist sinnlos, da ich die threads ja direkt zum anderen springen und die Rangfolge in der main()belanglos ist. Hab am Ende noch ne Endlosschleife angehängt, damit die main() abgearbeitet werden kann und das Programm nicht beendet wird. Werd das Programm am Montag mal so testen und mich bei aufkommenden Fragen wieder melden. Vielen Dank für die umfangreiche Hilfe!!! Freundlichen Gru�, Fertelle | ||
Antwort schreiben Antworten: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum