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 2 von 2     12   
meisteralex

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

Re: stringzugriff - wie könnte ich das regeln

  Alt 6. Jan 2006, 10:13
Jut, also im weisentlichen geht es darum das ich zwei Timerroutinen hab, welche auf den gleichen String zugreifen

Delphi-Quellcode:

//capturestring:string ist als globale Variable definiert



procedure Thauptform.tmrMouselogTimer(Sender: TObject);
var
x,y:integer;
aktuellerfenstertitel:string;
begin
x:= getmousex();
y:= getmousey();
  
        aktuellerfenstertitel := lesefenstertitel();
        if (aktuellerfenstertitel <> alterfenstertitel) then //Fenstertitel geändert
          begin
          
            
            alterfenstertitel := aktuellerfenstertitel;

            MyCS.Enter;
            Try //wenn fenster sich geändert hat, diese information mit der aktuellen mausposition in den string schreiben
              capturestring := capturestring + '|NWA|'+ aktuellerfenstertitel +'|NWE|'+'|MPA|'+inttostr(x)+','+inttostr(y)+'|MPE|';
            Finally
              MyCS.Leave;
            End;

          end
        else
          begin
            MyCS.Enter;
            Try //wenn fenster sich nicht geänder hat, nur die aktuelle mouseposition in den string schreiben
              capturestring := capturestring + '|MPA|'+inttostr(x)+','+inttostr(y)+'|MPE|';
            Finally
              MyCS.Leave;
            End;
          end;
  
end;



procedure Thauptform.tmrschreibeTimestampTimer(Sender: TObject);
begin
//erst prüfen wir ob die Zeitinformation erneuert werden muss
//es wird geprüft ob eine stunde vergangen ist

if (lasttimestamp + 3600 < datetimetounix(now())) then
  begin
    info('schreibe timestamp');
    MyCS.Enter;
    Try
      capturestring := capturestring + '|DTA|' + inttostr(datetimetounix(now())) + '|DTE|';
    Finally
      MyCS.Leave;
    End;
    lasttimestamp := datetimetounix(now());
    oldcapturestring := capturestring;
  end;
end;
//die Prozedur schreibt also jede Stunde in die Variable capturestiring den aktuellen Unixtimestamp

Problem des ganzen ist, wie schohn beschrieben, dass, wenn stündlich ein Timestamp in den String geschrieben wird, dieser den aktuellen Datenfluss abhackt
sprich aus dem richtigem Ergebnis '|NWA|Explorer|NWE||MPA|333,444|MPE||DTA|328974893 729|DTE|' wird z.b. '|NWA|Explo|DTA|328974893729|DTE|' wobei der Teil der abgehackt wird ('rer|NWE||MPA|333,444|MPE|') kommplett überschrieben wird
  Mit Zitat antworten Zitat
marabu

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

Re: stringzugriff - wie könnte ich das regeln

  Alt 6. Jan 2006, 13:55
Ein paar grundsätzliche Anmerkungen:

Wenn du Ereignisse deiner eigenen Anwendung protokollieren willst, dann solltest du keine Timer verwenden, sondern die events direkt anzapfen. Wenn du systemweite Ereignisse protokollieren willst, dann wirst du dich besser über hooks einklinken, auch hier sind Timer kein gutes Mittel.

Wenn deine Timer mit einem 10ms Intervall arbeiten, dann solltest du Vorkehrungen treffen, dass sie sich nicht selbst überholen. Du kannst den Wiedereintritt verhindern, indem du den Timer beim Eintritt in die Timer-Routine deaktivierst und zum Schluß wieder aktivierst. Wenn das Timer-Intervall als Takt arbeitet, dann kannst du deinen Code beim Wiedereintritt auch einfach aussetzen lassen.

Wenn du deine Protokollierung in einem string zwischenspeicherst, dann wächst der Zeitaufwand für das Neuzuordnen von Speicher. Noch schlimmer bemerkbar machen sich durch die ständige Speicheranforderung und -Freigabe die gelegentlich notwendigen Kompaktläufe des heap managers. Ein Intervall von 10ms reicht dann nicht immer aus, um den Umspeichervorgang korrekt zu beenden.

Wenn du deine Protokolleinträge so wie gezeigt in einen string speicherst, dann kannst du sie auch gleich wegwerfen. Eine spätere Auswertung deiner Protokolldatei ist viel zu kompliziert. Besser du sammelst deine Einträge in einer StringList. Und versuche eine einheitliches Format zu entwickeln, was die Auswertung stark vereinfachen würde.

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

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

Re: stringzugriff - wie könnte ich das regeln

  Alt 6. Jan 2006, 14:21
Erstmal eins vorneweg: Nimm Dir das, was der marabu sagt, mal zu Herzen.

Dessenungeachtet habe ich ein Testprogramm geschrieben, das derzeit einfach nonstop läuft, ohne irgendwelche Fehler zu produzieren ... Ich habe aber die Speicherung des Strings in eine Klasse gepackt, das ist ein bisserl sauberer...
Angehängte Dateien
Dateityp: zip threadsafestring_671.zip (211,0 KB, 6x aufgerufen)
"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
 
#14

Re: stringzugriff - wie könnte ich das regeln

  Alt 6. Jan 2006, 15:11
wie kann ich denn die events direkt anzapfen ? bzw. wie funktioniert das mit den hooks ?
  Mit Zitat antworten Zitat
marabu

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

Re: stringzugriff - wie könnte ich das regeln

  Alt 6. Jan 2006, 20:36
Mit dem direkten Anzapfen meinte ich, dass du im passenden event handler deiner Form (OnShow) deinen Protokolleintrag erzeugst. Hooks brauchst du nur, wenn du systemweit überwachen möchtest. Wenn mich nicht alles täuscht, dann solltest du zu diesem Thema auch in der DP etwas finden. Ansonsten hat der Windows Platform SDK ein passendes Kapitel.

marabu
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 22:37 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