AGB  ·  Datenschutz  ·  Impressum  







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

TCriticalSection Frage

Offene Frage von "Errraddicator"
Ein Thema von Errraddicator · begonnen am 5. Jun 2009 · letzter Beitrag vom 5. Jun 2009
Antwort Antwort
Errraddicator

Registriert seit: 26. Jun 2008
161 Beiträge
 
Delphi 2007 Professional
 
#1

TCriticalSection Frage

  Alt 5. Jun 2009, 11:13
Hiho!

Habe ein kleines Programm, welches ausnahmsweise mal Threads nutzen soll (brauche ich normalerweise nicht).
Jetzt habe ich meinen Thread eingebaut der die komplette Verarbeitung übernimmt und alles an Daten in sich selbst speichert.
Hat eigentlich nur den Sinn, dass das Hauptfenster nicht regelmäßig bei der Verarbeitung einfriert.

Einzige Zugriffe auf das Hauptfenster sind lesend auf die graphischen Komponenten (TDateTimePicker.Date z.B.) und auf die <writeStatus>-Funktion des selbigen.
Diese Funktion schreibt halt einen Text in den Statusbereich des Fensters und sieht so aus:

Delphi-Quellcode:
// writes the given message to the status-label & log-file
procedure TfrmMain.writeStatus();
begin
  csGui.Enter();
  try
    // write message to the status-label ...
    lblStatus.Caption := logMsg;
    lblStatus.Update();
    Application.ProcessMessages();

    // ... & log-file
    if logFile <> nil then
    begin
      logMsg := logMsg + #13#10;
      logFile.Write(PChar(logMsg)^, Length(logMsg) );
    end;
  except
    on e: Exception do
    begin
      logMsg := 'Fehler in Funktion <TfrmMain.writeStatus>: ' + e.Message;
      ShowMessage(logMsg);
    end;
  end;

  csGui.Leave();
end;
An sich funzt das auch einwandfrei, also das Programm/der Thread rattert durch und die Nachrichten werden regulär angezeigt.

Wenn ich das Hauptfenster dann jetzt aber schließen möchte, erhalte ich die Fehlermeldung:
"Die Ausnahme Unbekannter Softwarefehler (0x...) ist an der Anwendung an Stelle 0x... aufgetreten"
und anschließend
"Exception EOSError in Modul Programmname.exe bei 000....
Systemfehler Code 1400: Ungültiges Fensterhandle"

...

Diese Fehlermeldung hatte ich vor Einbindung des Threads und der Critical Sections nicht.

Da ich sämtliche Funktionen die ich nutze mit einem try-except Block versehen habe, kann ich also ausschließen, dass es sich in einer "meiner" Funktionen abspielt und nach Form.Close passiert.

Nur habe ich leider absolut keine Ahnung, was denn jetzt nich funktionieren sollte, denn alles funktioniert während des Programmes selbst einwandfrei, nur wenn ich es schließe knallt es...

Wurde der Thread nicht gestartet, erscheint diese Fehlermeldung ebenfalls nicht.
Kann es vielleicht sein, dass meine "ungeschützten" Lesezugriffe auf den DateTimePicker z.B. was damit zu tun haben?


Hat wer ne Idee?


Danke im Voraus

cu Patrick
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

Re: TCriticalSection Frage

  Alt 5. Jun 2009, 11:33
Wozu brauchst du das Application.Processmessages? Ich denke du hast einen Thread.
Und ich bin der Meinung, die GUI kannst du nicht in eine CS packen. Wie verhinderst du denn auf der anderen Seite, dass das Label grad neu gezeichnet wird?


btw.:
Zitat:
Habe ein kleines Programm, welches ausnahmsweise mal Threads nutzen soll (brauche ich normalerweise nicht).
Ich habe selten eine Programm, welches ohne Threads auskommt.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Errraddicator

Registriert seit: 26. Jun 2008
161 Beiträge
 
Delphi 2007 Professional
 
#3

Re: TCriticalSection Frage

  Alt 5. Jun 2009, 11:41
Zitat von sirius:
a) Wozu brauchst du das Application.Processmessages? Ich denke du hast einen Thread.
b) Und ich bin der Meinung, die GUI kannst du nicht in eine CS packen. Wie verhinderst du denn auf der anderen Seite, dass das Label grad neu gezeichnet wird?


c) btw.:
Zitat:
Habe ein kleines Programm, welches ausnahmsweise mal Threads nutzen soll (brauche ich normalerweise nicht).
Ich habe selten eine Programm, welches ohne Threads auskommt.
a) War vorher ohne Threads und daher rührt noch das ProcessMessages.

...

b) Geht mir ja viel mehr darum, dass diese Funktion nich zufällig mal vom Hauptfenster UND dem Thread gleichzeitig aufgerufen wird.
Das müsste ich mit einer CS doch so realisieren können, oder?

...

c) Also ich brauche das im Regelfall nich, da ich hauptsächlich Batchprogramme im weitesten Sinne betreibe.
Programmstart -> evt. Benutzereingaben -> Liest Daten -> Stellt was damit an -> Liste/PDF/Druck/DB/WasAuchImmer kommt raus -> Ende.

Einziger Vorteil von Threads wäre hier die Laufzeit, aber da die DB-Schnittstelle die ich benutzen muss eh nicht Threadtauglich ist, hat sich das Thema so oder so erledigt. *G*
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

Re: TCriticalSection Frage

  Alt 5. Jun 2009, 11:50
zu b) Ja, das kannst du so verhindern. Allerdings bleibt dann immer noch das Problem, dass die GUI ja auch selbstständig etwas macht (z.B. sich neu zeichnet). Dann hast du ein Problem, welches du hier nicht abfängst.

c) Warum soll eine DB-Schnittstelle Threadsicher sein. Ich lege die DB-Komponenten prinzipiell immer komplett in einen Thread.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: TCriticalSection Frage

  Alt 5. Jun 2009, 11:53
Es sollte halt in jedem Thread eine eigene Verbindung zur datenbank aufgebaut werden, wenn diese das unterstützt
Markus Kinzler
  Mit Zitat antworten Zitat
Errraddicator

Registriert seit: 26. Jun 2008
161 Beiträge
 
Delphi 2007 Professional
 
#6

Re: TCriticalSection Frage

  Alt 5. Jun 2009, 11:58
Zitat von sirius:
zu b) Ja, das kannst du so verhindern. Allerdings bleibt dann immer noch das Problem, dass die GUI ja auch selbstständig etwas macht (z.B. sich neu zeichnet). Dann hast du ein Problem, welches du hier nicht abfängst.

c) Warum soll eine DB-Schnittstelle Threadsicher sein. Ich lege die DB-Komponenten prinzipiell immer komplett in einen Thread.
Ich denke mal, irgendwas bei b) wird auch die Ursache für mein Problem gewesen sein.
Habe neben der Statusbar auch noch ein TAnimate gehabt, und sobald ich das entferne, erscheint der Fehler nicht mehr.

Vermute mal, dass sich das TAnimate selbst und gleichzeitig der Thread die StatusBar neu gezeichnet hat und das dadurch irgendwas kaputt gegangen ist, z.B.

Gibts da irgendwie ne Möglichkeit, wie ich das lösen kann? *grübel*

...

c) Ne so mein ich das nicht.
Der DB-Hersteller sagt selbst, es geht nur 1 aktive Verbindung je Prozess.

D.h. ich muss wenn ich 2 Verbindungen machen will auch explizit 2 komplett getrennte Prozesse/Programme haben und 2 Threads tun es da also nich mehr.

Hatte ich sogar mal erfolgreich programmiert indem ich quasi nen Client/Server im weitesten Sinne gemacht hatte.
Also 1 Master der 2 Unterprogramme aufruft und diese "koordiniert", während diese autonom verarbeiten.

Nur muss ich sagen war der Programmieraufwand gemessen am Nutzen irgendwie nich soooo berauschend gewesen, deswegen lasse ich das mittlerweile.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

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

Re: TCriticalSection Frage

  Alt 5. Jun 2009, 12:48
Zitat von Errraddicator:
Gibts da irgendwie ne Möglichkeit, wie ich das lösen kann? *grübel*
Ja, Synchronisieren via Messages. Mit einer Message an dem MainThread erriechst du, dass der Mainthread, dann nur diese Aktion durchführt und nix anderes. Die Methode Synchronize von TThread arbeitet damit.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  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 22:39 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