AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein stringzugriff - wie könnte ich das regeln
Thema durchsuchen
Ansicht
Themen-Optionen

stringzugriff - wie könnte ich das regeln

Ein Thema von meisteralex · begonnen am 27. Dez 2005 · letzter Beitrag vom 6. Jan 2006
Antwort Antwort
Seite 1 von 2  1 2      
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#1

stringzugriff - wie könnte ich das regeln

  Alt 27. Dez 2005, 18:10
Ich hab folgendes Problem
Hab hier ein Programm was ereignisse logt, so z.b. wenn jemand die maus bewegt, wenn sich ein neues fenster öffnet etc.
das sieht so aus, dass die ereignisse in einen string geschrieben werden (var logstring:string).
wenn jetzt z.b. jemand die maus bewegt wird mit logstring := logstring + '|MBA|x,y|MBE|' diese aktion in den string geschrieben (MBA und MBE dienen dabei als Identifier).
Hinterher wird der String dann in eine Datei geschrieben, wenn er "voll genug" ist.
Mein Problem ist nur, dass wenn die Maus bewegt wird und gleichzeitig z.b ein neues Fenster erscheint, quasi gleichzeitig auf den String zu gegriffen wird.
Anstatt wie es richtig wäre " |NFA|Ich bin ein neues Fenster|NFE| |MBA|x,y|MBE| " steht dann schonmal im String " |NFA|Ich bin ein ne|MBA|x,y|MBE|ues Fenster|NFE|" was mir hinterher bei der Auswertung ja nix mehr bringt.
Wie kann ich es also verhinder, dass der string logstring erst von der einen Prozedur fetch_MB(); geändert wird und solange exclusiv dieser prozedur zur Verfügung steht. Jemand ne idee ?
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: stringzugriff - wie könnte ich das regeln

  Alt 27. Dez 2005, 18:31
Solche parallelen Zugriffe must Du kapseln. Windows und damit Delphi bieten Dir diverse Werkzeuge zur Synchronisation. Wenn Du innerhalb eines Prozesses (nicht Thread) darauf zugreifst, reicht eine 'Critical Section'. Ansonsten, also wenn z.B. zwei Prozesse parallel auf etwas zugreifen müssen, dann muss man andere Mechanismen (z.B. Mutexe) verwenden.

Die Unit SyncObjs hält alle Delphi-Objekte bereit, um Dein Problem zu lösen.
Delphi-Quellcode:
Uses ... SyncObjs...;

Var
  MyCS : TCriticalSection;

Procedure ThreadSafeAdd (Var aSrc : String; Const aString);
Begin
  MyCS.Enter;
  Try
    aSrc := aSrc + aString;
  Finally
    MyCS.Leave;
  End;
End;

Initialization
  MyCS := TCriticalSection.Create;
Finalization
  MyCS.Free;
End.
Natürlich sollte man sowas als Klasse 'TThreadSafeString' implementieren.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#3

Re: stringzugriff - wie könnte ich das regeln

  Alt 29. Dez 2005, 12:10
hmm wie kann ich dennn testen ob es wirklich daran liegt
hab jetzt 3 timer auf einer form laufen , die alle 10ms den gleichen string bearbeiten,
hier treten jedoch sowohl mit als auch ohne den criticalselection code keine überschneidungen auf.
kann es vielleicht doch an was anderem liegen ?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: stringzugriff - wie könnte ich das regeln

  Alt 29. Dez 2005, 12:23
Wenn du das logging aus einem thread heraus machst, dann ist eine Synchronisierung notwendig. Wenn du aber den log string aus einem VCL event handler aufbaust, dann eher nicht, da deine Delphi Anwendung ohne dein Zutun keine Nebenläufigkeit aufweist.

Grüße vom marabu
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: stringzugriff - wie könnte ich das regeln

  Alt 29. Dez 2005, 13:09
Zitat von meisteralex:
hab jetzt 3 timer auf einer form laufen , die alle 10ms den gleichen string bearbeiten...?
Die werden sich dann wohl kaum gegenseitig auf die Füße treten. Stell Dir vor, drei Menschen laufen im Kreis (blöde Vorstellung, aber stell Dir vor, es sind Soldaten, dann klappts ). Wenn alle gleich schnell laufen, müssen sie sich nie abstimmen. Läuft aber der eine etwas schneller, oder der Andere etwas langsamer, kommt es zwangsweise zu 'Synchronisationsproblemen', bzw. auf gut Deutsch, Aufdenfußtretismus.

Sowas testet man mit threads, die nonstop auf die Strings zugreifen. Dann ist die Warscheinlichkeit größer, das sie sich mal stören. Aber glaub mir, mit CriticalSections bist Du auf der sicheren Seite. An etwas Anderem liegt es nicht.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#6

Re: stringzugriff - wie könnte ich das regeln

  Alt 29. Dez 2005, 13:42
jut werd es einbauen und euch verklagen wenns nicht stimmt.
ne mal im ernst vielen dank für die bemühungen , denke auch dass es klappen wird
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: stringzugriff - wie könnte ich das regeln

  Alt 29. Dez 2005, 14:37
Zitat von meisteralex:
jut werd es einbauen und euch verklagen wenns nicht stimmt.
Endlich mal wat los hier in den Laden
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#8

Re: stringzugriff - wie könnte ich das regeln

  Alt 5. Jan 2006, 13:52
hmm hat leider doch nicht funktioniert????

es ist, so das der Sring an manchmal an einer Stelle einfach abgeschnitten wird. sprich, auch hinterher nicht mehr angefügt wird

Statt des richtigen Resultates " |NFA|Ich bin ein neues Fenster|NFE| |MBA|x,y|MBE| "
bekomme ich also z.b " |NFA|Ich bin ein neu|MBA|x,y|MBE| "
oder " |NFA|Ich bin ein neues Fen|MBA|x,y|MBE| "

weiß irgendjemand noch ne Lösung ?
  Mit Zitat antworten Zitat
meisteralex

Registriert seit: 22. Nov 2005
173 Beiträge
 
#9

Re: stringzugriff - wie könnte ich das regeln

  Alt 5. Jan 2006, 14:43
hmm niemand ne idee ? das komische ist auch, das es erst so ab dem 35000 zeichen auftauch, dann aber vermehrt
wäre so ne art puffer für die string ne idee ?
weiß jemand wie man sowas programmiert
?
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: stringzugriff - wie könnte ich das regeln

  Alt 5. Jan 2006, 15:05
Versteh ich nicht, das das *nicht* funktionieren soll. Kannst Du den Code nicht mal posten?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz