Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Multithreading und allgemeine Programmierung Kategorie: Programmierung C (von Franz-Peter - 13.01.2012 17:32)
Als Antwort auf Re: Multithreading und allgemeine Programmierung von Fertelle - 13.01.2012 16:19
Ich nutze:
C-Control Pro Mega32, C-Control Pro Mega128, CC-Pro 128 Application Board, Pro-Bot128
> > > > > 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


    Antwort schreiben


Antworten:

Re: Multithreading und allgemeine Programmierung (von Fertelle - 14.01.2012 11:20)