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 - 19.03.2026 17:51)
Als Antwort auf Re: Capture verhalten: Funktionen und Threads von Detlef - 19.03.2026 14:02
Ich nutze:
C-Control II Station, OSOPT V3.1
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: