AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Critical Section

Ein Thema von DoktorD · begonnen am 6. Jun 2008 · letzter Beitrag vom 8. Jun 2008
Antwort Antwort
DoktorD

Registriert seit: 13. Dez 2005
153 Beiträge
 
#1

Problem mit Critical Section

  Alt 6. Jun 2008, 07:40
Hi.

Ich habe ein RichEdit und versuche mit einem Thread und meiner Hauptapplikation in dieses reinzuschreiben (logging). Bei der Programmierung war mir also klar, dass ich eine Critical Section verwenden müsste.
Dies hab ich auch gemacht, jedoch stürzt das Programm einfach ab, wenn beide ins RichEdit reinschreiben wollen. Ich kanns auch nicht debuggen, da es dann nicht abstürzt und richtig läuft.

Ich habe jetzt schon einiges probiert und festgestellt, dass sobald irgendetwas mit dem rtfOutputWindow (RichEdit) in der Critical Section gemacht wird, es zum absturz kommt. Kommentiere ich diese aus stürzt es nicht ab (hab dann aber auch nicht die gewünschte Funktion).

Hat irgendjemand eine Idee??? Vielen Dank schonmal

hier mal der Code:

Delphi-Quellcode:
procedure TFrmApplication.PutTextToOutputWindow(Text: String; Color: TColor);
var
  Zeit:String;
Begin
  if CriticalSection <> nil then
  begin
    CriticalSection.Enter; // Critical Section gestartet
    /////////////////////////////////////////////////////
    rtfOutputWindow.SelAttributes.Color := Color;
    //Timestamp einfügen
    DateTimeToString(Zeit, 'hh:nn:ss:zzz', Now);
    Text := Zeit + ' ' + Text;
    rtfOutputWindow.SelStart := rtfOutputWindow.GetTextLen;
    rtfOutputWindow.Lines.Add(Text);
    SendMessage(rtfOutputWindow.Handle, EM_LINESCROLL , 0, 1);
    /////////////////////////////////////////////////////
    CriticalSection.Leave; // Critical Section beendet
  end
  else
    Assert(FALSE,'CriticalSection = nil');
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#2

Re: Problem mit Critical Section

  Alt 6. Jun 2008, 07:45
mit CriticalSection blockierst du nur den gleichzeitigen Zugriff innerhalb der Funktion.

Aber es ist wichtiger auch die Zugriffe der VCL zu blockieren ... schau mal nach Hier im Forum suchenSynchronize / Hier im Forum suchenThread Synchronize.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
DoktorD

Registriert seit: 13. Dez 2005
153 Beiträge
 
#3

Re: Problem mit Critical Section

  Alt 6. Jun 2008, 07:47
Mhhh. Verstehe ich irgendwie nicht. Ich greife ja auch nur innerhalb dieser Funktion auf das RichEdit zu. Diese Funkion wird vom beiden Threads aufgerufen.

Kannst du mirs vielleicht ein bisschen deutlicher erklären?

Danke
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Problem mit Critical Section

  Alt 6. Jun 2008, 07:54
Es kommt zu "tollen" fehlern wenn du von einem anderen Thread (als dem Hauptthread) auf VCL-Object zugreifst. Es ist dabei unabhängig ob diese durch eine CriticalSection abgesichert sind. Du solltest sicherstellen das Zugriffe auf dein RichEdit ausschließlich vom Hauptthread aus erfolgen. Und um das zu erreichen kann im im TThread die Methode syncronize benutzen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#5

Re: Problem mit Critical Section

  Alt 6. Jun 2008, 07:54
Damit das RichEdit verwaltet und angezeigt werden kann, greift die VCL (ohne Beachtung deiner CriticalSection) auch noch darauf zu
und nicht nur deine beiden Threads (mit dieser Funktion/CriticalSection).

Mit Synchronize (TThread) wird die an Synchronize übergebene Prozedur sozusagen im Kontext des Hauptthreads ausgeführt ... heißt es kann nur noch Einwas (über den Hauptthread) zur gleichen Zeit zugreifen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
DoktorD

Registriert seit: 13. Dez 2005
153 Beiträge
 
#6

Re: Problem mit Critical Section

  Alt 6. Jun 2008, 07:59
Aha. Jetzt hab ichs verstanden.

Schickt das, wenn ich das dann so mache? Mit DebugString wird die oben gezeigte Funktion aufgerufen die dann ins RichEdit schreibt.

Delphi-Quellcode:
procedure CThread1.Execute;
begin
  inherited;

  while not Terminated do
  begin
    Synchronize(LogString);
  end;
end;

procedure CThread1.LogString;
begin
  DebugString('Thread 1.1');
  DebugString('Thread 1.2');
  DebugString('Thread 1.3');
end;
  Mit Zitat antworten Zitat
DoktorD

Registriert seit: 13. Dez 2005
153 Beiträge
 
#7

Re: Problem mit Critical Section

  Alt 6. Jun 2008, 10:02
Also. Ich hatte eben den Effekt, dass ich wenn ich im Thread mit Synchronize arbeite, dass mein Programm abstürzt, sobald es in die Critical Section kommt (Enter).
Die Critical Section habe ich dann entfernt. Nun habe ich aber nicht mehr die Funktion des Threads wie vorher.
D.h. wenn über das Hauptfenster ein Modales Fenster geöffnet wird, stoppt der Thread und fängt erst wieder an, wenn ich das Fenster wieder schließe.

Warum ist das mit Synchronize so? Das ist doch gerade der Vorteil von Threads, das ich etwas parallel laufen lassen kann, oder?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Problem mit Critical Section

  Alt 6. Jun 2008, 10:13
Synchronize interessiert sich nicht für modal, es reagiert wie gewöhnlich. Dein Fehler muss woanders liegen


EDit: 2000
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#9

Re: Problem mit Critical Section

  Alt 8. Jun 2008, 17:09
Synchronize wartet mit der Ausführung der Funktion, bis der Hauptthread zeit für deren Ausführung hat ... heißt, wenn der Hauptthread grad etwas macht, dann stoppt sozusagen der aufrufende Thread.

aber eigentlich ollte der Haupthtread eigentlich nicht viel zu tun haben,
oder fürhrst du dort irgendwelche "aufwendigeren" Operationen aus?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:17 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