AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi TThread + OLE/COM Excel + Unassigned = Verwirrung :(
Thema durchsuchen
Ansicht
Themen-Optionen

TThread + OLE/COM Excel + Unassigned = Verwirrung :(

Ein Thema von TottiW · begonnen am 16. Jun 2008 · letzter Beitrag vom 16. Jun 2008
Antwort Antwort
TottiW

Registriert seit: 16. Jun 2008
1 Beiträge
 
#1

TThread + OLE/COM Excel + Unassigned = Verwirrung :(

  Alt 16. Jun 2008, 14:34
Helau, Euer Forum hat einen neuen Delphianer!

Und dieser hat seit 2 Tagen ein für ihn nicht lösbares Problem?!?
Ich habe viel recherchiert, komme aber ohne Eure Hilfe nicht weiter.

Ich hoffe, ich poste im richtigen Bereich, aber dieser schien mir aufgrund der VCL am passensten.

Aufgabe:
Ich habe eine multithreaded-Anwendung. Nun möchte ich in Excel 2000 loggen.

Lösungsansatz:
Um mich nicht mit dem Multithreaded-Appartment-Model von COM herumschlagen zu müssen, schreibe ich die Log-Einträge in eine Queue. In der Thread.Execute-Methode werden die Einträge aus der Queue geholt und über COM in die Excel-Datei geschrieben. Es gibt nur eine Instanz des Logging-Threads.
- Am Anfang der Thread.Execute wird das OLE-Objekt erzeugt
- In der while not self.Terminated werden die Einträge aus der Queue geschrieben
- Wenn der Thread terminiert wird, wird Excel beendet

Problem:
Wenn ich Excel aus dem Thread schließen möchte, bleibt es weiterhin im Taskmanager - trotz Xls:= Unassigned.

Um die Verwirrung zu vervollständigen (wie im Codebeispiel):
- Ich schließe Excel im Code nicht per Xls.Application.Quit sondern sage Xls.Visible:= true;
- Beende meine Anwendung - Der Thread wird terminiert
- Nun beende ich Excel manuell über die Excel-Oberfläche -> Excel bleibt auch weiterhin im Taskmanager

- Führe ich die Anweisungen aus dem GUI-Thread aus durch, ist alles i.O.

Ich bin verzweifelt und komme einfach nicht mehr weiter. Ich hoffe, dass mir jemand von euch auf die Sprünge helfen kann.

Vielen Dank!!!
Totti


Hier die vereinfachte Execute-Methode des Threads:

Delphi-Quellcode:
procedure TLoggingExcel.Execute;
var
  fExl, fSht: Variant;
begin
  inherited;
  CoInitializeEx(nil,0);
  fExl:=CreateOleObject('Excel.Application');

  fExl.Application.SheetsInNewWorkbook:= 1;
  fExl.Workbooks.Add;
  fExl.Sheets.Add;
  fSht:= fExl.Sheets[1];

  fSht.Name := 'Log Sprachverständlichkeit';//fileExcelLog;

  fExl.ActiveWorkbook.SaveAs('C:\test.xls');

  while self.Terminated=false do
  begin
    fSht.Cells[1,1].Value:= 'COM plus Threads ist mir suspekt';
    fExl.ActiveWorkbook.Save;
  end;
      
  fExl.Visible:=true;
  fExl.ActiveWorkbook.Saved:= true;
  //fExl.Application.Quit;
  hSht:= Unassigned;
  fExl:= Unassigned;
  CoUnInitialize;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Harry M.
Harry M.

Registriert seit: 29. Okt 2004
Ort: Halle
462 Beiträge
 
#2

Re: TThread + OLE/COM Excel + Unassigned = Verwirrung :(

  Alt 16. Jun 2008, 15:23
PID's der Prozesse holen ExeclApp erzeugen, nochmal PIDs holen, PID zum current ExeclApp ermitteln und die ggf hart abschießen.
Man könnte auch versuchen nicht über Variant-Ole sondern über TExcelApplication zu gehen.

PS: Willkomen in der DP
Harry
Gruß Harry
www.H-Soft.info
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: TThread + OLE/COM Excel + Unassigned = Verwirrung :(

  Alt 16. Jun 2008, 18:08
Hallo TottiW,

Zitat:
Ich schließe Excel im Code nicht per Xls.Application.Quit sondern sage Xls.Visible:= true;
Also mit Xls.Visible:= true wird Excel nicht geschlossen, sondern es wird nur Sichtbargemacht.
Wenn Du xls.Visible:= False; angibst wird Excel unsichtbar.

Zitat:
Nun beende ich Excel manuell über die Excel-Oberfläche -> Excel bleibt auch weiterhin im Taskmanager
Dann hast Du es nicht ordentlich geschlossen.

fExl.Quit; schließt Excel.

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  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:47 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