Hallo,
leider ist der Titel nicht ganz passend gewählt und mein Problem etwas undurchsichtig, aber ich versuche es mal bestmöglich darzustellen:
Ich habe einen Service, in welchem man Jobs anlegen kann, die verschiedene Events abwarten und bei deren eintreten eine Mail verschicken. Das geht auch mit mehreren Jobs. Sprich: Wenn Event A eintritt, dann schicke eine Mail an Person, welche im Auftrag (Job) A angegeben ist; Wenn Event B eintritt, dann schicke eine Mail an Person, welche im Auftrag B angegeben ist. Zu bestimmten Zeiten, welche ebenfalls im Auftrag festgelegt sind, wird dann ein Report bzw. eine Mail erstellt, welche die Events und Informationen enthält. Jetzt habe ich 2 Jobs angelegt, welche zur selben Zeit ihren Report abschicken sollen. In einer Schleife funktioniert das so:
Delphi-Quellcode:
if EventCount > 0 then // wenn mehr als 0 Events existieren
begin
Log(False, 'EventCount for "' + Jobs[i].AName+ '": ' +
IntToStr(EventCount)); // Im Log festhalten, wieviele Events für den Job eingetreten sind
Log(False, 'All Events: ' + IntToStr(Length(Events))); // Die Anzahl aller Events im Log festhalten
SendMail(i); // Mail schicken; i = Schleifen-Variable
end;
Die Funktion Log habe ich selbst geschrieben, sie kapselt einfach nur den Zugriff auf eine Textdatei. In der Funktion SendMail wird einfach nur eine TStringList mit Text und Infos gefüllt und später an den MailBody übergeben. Anschließend wird eine
DLL von mir aufgerufen, welche die Mail verschickt. Schlussendlich werden am Ende der SendMail-Prozedur noch die bereits geschickten Events aus der Liste der ausstehenden Events entfernt.
Die Ausgabe in meinem Log sieht übrigens so aus:
EventCount for "Auftrag 1": 3
All Events: 11
[18.03.2014 14:50:05]: INFORMATION: Message to "empfänger_1@googlemail.com" was successfully transmitted
EventCount for "Auftrag 2": 8
All Events: 8
[18.03.2014 14:50:09]: INFORMATION: Message to "empfänger_2@isforb.com" was successfully transmitted
Es funktioniert alles wie beschrieben: Es existieren zu Beginn 11 Events in der Liste, 3 für Job A. Nach dem verschicken der ersten Mail existeren noch 8, alle für Job B, das ist ja logisch.
Bis hierhin klappt auch alles, allerdings war die Ausgabe im Log nur zu Testzwecken, die interessiert mich nicht wirklich. Ich möchte nur wissen, ob die Mail erfolgreich geschickt wurde. Also sieht die Routine jetzt wie folgt aus:
Delphi-Quellcode:
if EventCount > 0 then // wenn mehr als 0 Events existieren
SendMail(i); // Mail schicken; i = Schleifen-Variable
Allerdings erhalte ich jetzt eine Zugriffsverletzung. Das Log dazu sieht so aus:
[18.03.2014 14:58:05]: INFORMATION: Message to "empfänger_1@googlemail.com" was successfully transmitted
[18.03.2014 14:58:05]: CRITICAL ERROR: [EAccessViolation] "Zugriffsverletzung bei Adresse 0040479F in Modul 'RPU_SRV.exe'. Lesen von Adresse 0324DD9C"
Jetzt verstehe ich aber nicht warum ich diese Zugriffsverletzung erhalte. Das Log hat ja rein garnichts mit dem Rest zu tun. In der der Prozedur wird lediglich in eine Textdatei geschrieben. Warum erhalte ich nun beim senden der zweiten Mail einen Fehler?
Ich sage vllt. noch dazu, das der Service aus mehreren Threads besteht, aber das war auch das einzige was noch wichtig sein könnte.
Ich hoffe ihr könnt mir helfen, natürlich könnte ich auch einfach die Zeilen mit dem Log stehen lassen, das würde aber meine Ehre kränken
P.S: Sorry für den vielen Text... Vielleicht sollte ich Autor werden
Gruß,
Lukas