Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Capture verhalten: Funktionen und Threads Kategorie: Programmierung (von Detlef - 8.04.2026 13:04)
Als Antwort auf Re: Capture verhalten: Funktionen und Threads von Egbert - 20.03.2026 15:38
Ich nutze:
C-Control II Station, OSOPT V3.0
Hallo Egbert,

das capture funktioniert einwandfrei auch ĂĽber mehrere Threads. Hab alles so zurĂĽckgebaut.

Mein Fehler war ein "Edge-Case", der mit einer Datenbank-Optimierung zusammenhing und nur sehr
selten auftritt.

Danke fĂĽrs helfen,

viele GrĂĽĂ?e

Detlef

> Hallo Detlef,
>
> ist p.ueb eine globale(!) Variable, also auĂ?erhalb eines Threads definiert?
> Aus dem Manual: Die explizite Form erwartet die Angabe eines Bezeichners einer
> globalen(!) byte-Variable.
>
> Der Funktionsaufruf mit den 4 int Werten wird - so meine Vermutung - auch in
> mehreren Programmschritten intern abgearbeitet. Ich könnte mir vorstellen, dass
> diese Abfolge durch einen Thread-Wechsel unterbrochen werden kann.
> Dann kann es irgendwann auch zu inkonsistenten Werten eines Datensatzes kommen.
>
> Wichtig ist, dass die verwendeten (globalen) Variablen eines Datensatzes auch gegen
> konkurierenden Zugriff der verschiedenen Thread geschĂĽtzt werden. Und - die Update-Threads
> dĂĽrfen sich nicht gegenseitig behindern.
>
> Viel Erfolg bei der Fehlersuche.
> Egbert
>
>
> > Hier der Sourcecode:
> >
> >
> >
> >
> > byte ueb;  // capturevariable (steht im file p)
> >
> > function akt_control(int akt, int modi, int wert, int delay)
> >   {
> >   capture p.ueb;
> >   db.DS_update_Akt(system.timer()-p.offset+delay,(modi/10)*1000+akt, wert, modi);
> >   release;
> >   }
> >
> >

> >
> > Es gibt eben einen Thread, der die Datensätze abarbeitet und einen Thread der mit obiger Funktion
> > neue Datensätze einträgt oder aktualisisert. Läuft ohne Probleme, bis ein dritter Thread die
> > gleiche obige Funktion verwendet. Dann "hängt" es sporadisch im capture.
> >
> > Da ich die Datensätze in der Datenbank sehen kann, sehe ich dass Einträge aus beiden Threads drin
> > sind. Will ich den Fehler provozieren, gelingt es mir nicht.
> >
> >
> >
> >
> > > Hallo Egbert,
> > >
> > > danke für den Hinweis. Ich habe tatsächlich eine globale byte Variable in der Software.
> > >
> > > Also ich speichere die Daten in einer eigenen Datenbank aus einem Array mit Zeiger und zwei
> > > Index. Das funktioniert sauber, schnell und verlä�lich.
> > >
> > > Mit zwei Threads gibt es kein Problem.
> > > Nur kommt ein dritter dazu, der die gleiche Funktion zum Datensatz schreiben verwendet,
> > > hänge ich ab und zu mutma�lich in einem Capture log.
> > >
> > > Ich zeige den Code, nur mein Programmierrechner (alt) hat kein Netzwerkzugang! :-)
> > >
> > >
> > >
> > >
> > >
> > > > Hallo Detlef,
> > > >
> > > > laut Manual erwartet der capture Befehl eine globale (!)byte Variable.
> > > > Du verwendest eine globale int Variable.
> > > > Vielleicht ist das ein Grund fĂĽr das Problem.
> > > >
> > > > Leider lässt sich in deinem Beispiel nicht erkennen, wie du die Daten speicherst.
> > > > Sind des einzelne Variablen, sind es Arrays, ... lokal oder global
> > > > Da gibt es unterschiedliches Verhalten bei der Ă?bergabe an eine Funktion.
> > > >
> > > > Gutes Gelingen
> > > > Egbert
> > > >
> > > >
> > > > >
> > > > > Moin Nochmal,
> > > > >
> > > > > im Prinzip läuft es auf die Frage hinaus:
> > > > >
> > > > > Kommt der Compiler damit klar, wenn ich den Capture Bereich in eine Funktion ausgliedere
> > > > > und diese Funktion in mehreren Threads verwende?
> > > > >
> > > > > Vielleicht probiere ich einfach mal aus, die Funktionen threadspezifisch mehrfach anzulegen.
> > > > >
> > > > > Schönes WE,
> > > > >
> > > > > Detlef
> > > > >
> > > > > > Nochmal ohne Fehler:
> > > > > >
> > > > > > Moin Zusammen,
> > > > > >  
> > > > > >  ich hätte eine Frage um sporadisches Verhalten zu erklären.
> > > > > >  
> > > > > >  Muss ich die Captures und Releases explizit in die Threads schreiben oder funktioniert es auch
> > > > > >  ĂĽber Funktionen?
> > > > > >  
> > > > > >  Beispiel:
> > > > > >  
> > > > > >  
> > > > > >  
> > > > > >  int flag;
> > > > > >  
> > > > > >  function update(int a)
> > > > > >   {
> > > > > >   capture flag;
> > > > > >   function updatedata(a);
> > > > > >   release flag;
> > > > > >   }
> > > > > >  
> > > > > >  thread main()
> > > > > >   {
> > > > > >   capture flag;
> > > > > >   machirgendwasmitdendaten();
> > > > > >   release flag;
> > > > > >   }
> > > > > >  
> > > > > >  thread one()
> > > > > >   {
> > > > > >   update(1);
> > > > > >   }
> > > > > >  
> > > > > >  thread two()
> > > > > >   {
> > > > > >   update(2);
> > > > > >   }
> > > > > >  
> > > > > >  thread three()
> > > > > >   {
> > > > > >   update(3);
> > > > > >   }
> > > > > >  
> > > > > >  

> > > > > >  
> > > > > >  Wenn diese vier Threads laufen, ist dann sichergestellt, das immer nur in einem Thread die Daten
> > > > > >  bearbeitet werden?  Oder muss ich die Captures und Releases explizit in den Threads erwähnen?
> > > > > >  
> > > > > >  Ich habe es so wie oben gezeigt realisisert und kriege sporadisch Fehler, die ich nur damit
> > > > > >  begrĂĽnden kann, dass Daten gleichzeitig in zwei threads bearbeitet werden...
> > > > > >  
> > > > > >  
> > > > > >  Beste GrĂĽĂ?e
> > > > > >  
> > > > > >  Detlef


    Antwort schreiben


Antworten: