Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Mail versenden in Thread auslagern (https://www.delphipraxis.net/112903-mail-versenden-thread-auslagern.html)

Ducksoul 29. Apr 2008 11:13


Mail versenden in Thread auslagern
 
Hallo,
und zwar dauerte das Versenden von Mails mit großen Anhängen immer äußerst lang, woraufhin ich versucht habe es in einen einen extra Thread auszulagern. Mit Threads kenn ich mich allerdings nich aus und irgendwas schein ich auch falsch gemacht zu haben, da ich eine Exception "Ungültiges Handle" beim Schließen des Programms bekomme.
Ich glaube das hat irgendwas mit Thread Synchronisation zu tun oder so... Aber da steig ich nicht sorecht durch.

Delphi-Quellcode:
procedure SendenThreadExecute;
    var tp: PThreadParams;
        Thread: THandle;
        ExitCode: Cardinal;
        ec: DWORD;
        ThreadID: Cardinal;
    begin

    if Length(MailForm.SubjectEdit.Text) >= 3 then
      begin

      New(tp);

      with Mailform.IdMsgSend do
          begin
            Body.Assign(Mailform.ContentMemo.Lines);
            From.Text := UserEmail;
            ReplyTo.EMailAddresses := UserEmail;
            Recipients.EMailAddresses := ReceiverEmail; { To: header }
            Subject := Mailform.SubjectEdit.Text; { Subject: header }
            Priority := TIdMessagePriority(Mailform.PrioComboBox.ItemIndex); { Message Priority }
          end; // with

      Mailform.SMTP.Username := SmtpServerUser;
      Mailform.SMTP.Password := SmtpServerPassword;

      {Allgemeine Einstellungen}
      Mailform.SMTP.Host := SmtpServerName;
      Mailform.SMTP.Port := SmtpServerPort;

      tp.sttemp := Mailform.EingangStatusBar.Panels[1].Text;
      Mailform.Label1.Caption := tp^.sttemp;
      tp.msgSend := Mailform.IdMsgSend;
      Thread := BeginThread(nil, 0, @SendenThreadFunction, tp, 0, ThreadID);
        // Auf Beendigung des Threads warten.
      //WaitForSingleObject(Thread, INFINITE);
      CloseHandle(Thread);
      end //if
    else
      begin
        MessageDlg('Bitte geben Sie einen Betreff ein.', mtWarning ,[mbOK],0);
      end;
    end;

  function SendenThreadFunction(tp: PThreadParams): Integer;
  var msgSend: TIdMessage;
      sttemp: String;
  begin
    sttemp := PThreadParams(tp)^.sttemp;
    msgSend := PThreadParams(tp)^.msgSend;
    {Mail verschicken}
    Mailform.ShowStatus('Verbindung mit Postausgangsserver wird hergestellt...');
    Mailform.SMTP.Connect;

    try
      Mailform.SMTP.Send(msgSend);
      Mailform.ShowStatus('Nachricht wird gesendet');
    finally
      Mailform.SMTP.Disconnect;
      Mailform.ShowStatus(sttemp);
      Mailform.MailPb.Visible := False;
      Mailform.MailPb.Position := Mailform.MailPb.Max;
      Mailform.EingangStatusBar.Panels[0].Text := 'Senden erfolgreich';
      Dispose(tp);
    end; // try

Könntet ihr mir vielleicht nen Hinweis geben was ich falsch mache und nen Anstoß wie ich es richtig machen kann? Danke

Bernhard Geyer 29. Apr 2008 11:31

Re: Mail versenden in Thread auslagern
 
So ziemlich jede 2te Zeile verursacht Probleme.
Lies bitte nochmal den Kommendar in der Quelldatei durch wenn dir Delphi eine neue Unit für ein von TThread-Abgeleitete Klasse erzeugt.

Die VCL ist hier nicht Thread-Save, da die Win32-API hier eine Thread-Gebundene Verwendung von erzeugten GUI-Controls verlangt.

Ducksoul 30. Apr 2008 01:02

Re: Mail versenden in Thread auslagern
 
Vielen Dank schonmal für die Antwort.

Zitat:

Die VCL ist hier nicht Thread-Save, da die Win32-API hier eine Thread-Gebundene Verwendung von erzeugten GUI-Controls verlangt.
Eine Thread-Gebundene Verwendung von erzeugten GUI-Controls - Was heißt das jetzt für mich im Klartext? Ich komme mit dem Hinweis immernoch nicht auf einen Lösungsweg.

Viele Grüße,
Franz

Bernhard Geyer 30. Apr 2008 06:50

Re: Mail versenden in Thread auslagern
 
Zitat:

Zitat von Ducksoul
Eine Thread-Gebundene Verwendung von erzeugten GUI-Controls - Was heißt das jetzt für mich im Klartext? Ich komme mit dem Hinweis immernoch nicht auf einen Lösungsweg.

Du darfst im Thread nichts mit VCL-GUI-Controls machen. Keine Aktualiserung, kein Auslesen von Werte (da hier bei diversen Controls Windows-Messages verwendet werden), kein VCl-Formular anzeigen. Wenn du etwas machen willst dann Asynchron per Windows-Message-Benachrichtigung oder per Sychnronize-Aufruf im Hauptthread der Anwendung.

SirThornberry 30. Apr 2008 08:07

Re: Mail versenden in Thread auslagern
 
oder Syncron per window-message

Viktorii 30. Apr 2008 08:40

Re: Mail versenden in Thread auslagern
 
Zitat:

Zitat von Bernhard Geyer
... oder per Sychnronize-Aufruf im Hauptthread der Anwendung.

Hi,
könntest Du evtl. ein kurzes Beispiel posten? Irgendwie verstehe ich nicht wie man das realisiert, trotz Online Hilfe....
Schon mal vielen Dank im Voraus

Luckie 30. Apr 2008 08:53

Re: Mail versenden in Thread auslagern
 
Threading Tutorial: http://delphitutorials.michael-puff.de

Ducksoul 1. Mai 2008 22:24

Re: Mail versenden in Thread auslagern
 
Ich danke dir vielmals für deine Hilfe Bernhard. Ich werde das Tutorial jetzt mal komplett durcharbeiten. Mit der Hilfe des Tutorials bin ich ja erstmal so weit gekommen wie ich schon bin :P
Falls ich noch Probleme habe werd ich mich nochmal zu Wort melden. :)

Viele Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz