AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Sendevorgang blockiert meine Software
Thema durchsuchen
Ansicht
Themen-Optionen

Sendevorgang blockiert meine Software

Offene Frage von "skyquaker"
Ein Thema von skyquaker · begonnen am 25. Feb 2007 · letzter Beitrag vom 27. Feb 2007
Antwort Antwort
Seite 1 von 2  1 2      
skyquaker

Registriert seit: 14. Sep 2006
96 Beiträge
 
Delphi 7 Professional
 
#1

Sendevorgang blockiert meine Software

  Alt 25. Feb 2007, 08:41
Ich versende in meiner Software mit SMTP meherere Emails mit großen Anhängen. Während ich diese versende, bleibt meine Software jedoch unbenutzbar und wird als "Not Responding" angezeigt. Die Emails werden zwar verschickt, ich kann aber z.B. keinen Pause Knopf betätigen.

Delphi-Quellcode:
procedure TForm1.sndButtonClick(Sender: TObject);
var i : integer;
begin

probar.Visible := true;
probar.Max := globalcnt;


for i := 1 to globalcnt -1 do
begin
 if FileExists('./temporary/'+ExtractFileName(opendiag.filename)+'_'+Inttostr(i)) then
    TIdAttachment.Create(email.MessageParts, './temporary/'+ExtractFileName(opendiag.filename)+'_'+Inttostr(i));
 EMail.Subject := 'Auto generated Message';
 smtp1.Connect;

   try
   smtp1.Send(Email);
   smtp1.Disconnect;
  except on E:Exception do
      Errorlog.Lines.Insert(0, 'ERROR: ' + E.Message);
    end;
   probar.StepIt;
   eMail.MessageParts.Clear;
end;

end;
Was muss ich machen um meine Software auch während des Sendevorgangs benutzbar zu machen?
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Sende Vorgang blockiert meine Software

  Alt 25. Feb 2007, 08:43
Hi,

dafür sind Threads ideal.
Diese laufen nebenher und senden die E-Mails im Hintergrund parallel zur Programmausführung.

Aber Achtung: Auf die VCL im Thread immer nur mit Delphi-Referenz durchsuchenSynchronize zugreifen.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Sende Vorgang blockiert meine Software

  Alt 25. Feb 2007, 08:44
Zitat von skyquaker:
...Was muss ich machen um meine Software auch während des Sendevorgangs benutzbar zu machen?
Du musst das versenden der Mails in Threads auslagern. Das ist denke ich die vernünftigste Lösung.

Edit: Warum bekomme ich eigentlich NIE so einen rosten Kasten zu sehen?
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
skyquaker

Registriert seit: 14. Sep 2006
96 Beiträge
 
Delphi 7 Professional
 
#4

Re: Sendevorgang blockiert meine Software

  Alt 25. Feb 2007, 08:46
Danke für die schnellen Antworten

Ich werd das jetzt mal versuchen mit den Threads.
  Mit Zitat antworten Zitat
skyquaker

Registriert seit: 14. Sep 2006
96 Beiträge
 
Delphi 7 Professional
 
#5

Re: Sendevorgang blockiert meine Software

  Alt 25. Feb 2007, 09:10
Irgendwie schaff ich das nicht. Könnte mir jemand vielleicht ein Beispiel schreiben?
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Sendevorgang blockiert meine Software

  Alt 25. Feb 2007, 09:24
Du könntest dir Beispiele oder Luckies Thread-Tutorial ansehen.

Ansonsten zeig uns deinen Ansatz und dann können wir zusammen die Fehler ausmerzen.
  Mit Zitat antworten Zitat
skyquaker

Registriert seit: 14. Sep 2006
96 Beiträge
 
Delphi 7 Professional
 
#7

Re: Sendevorgang blockiert meine Software

  Alt 25. Feb 2007, 10:06
Also ich stecke hier fest:

Delphi-Quellcode:
...
type TMailThread = function(mail: TIDMessage; SMTP1: TIDSmTP; Filep: String): Integer;
...
function MailThread(email: TIdMessage; smtp1: TIdSmtp; Filep: String): Integer;
var i: Integer;
begin

for i := 1 to globalcnt -1 do
begin
 if FileExists('./temporary/'+ExtractFileName(filep)+'_'+Inttostr(i)) then
    TIdAttachment.Create(email.MessageParts, './temporary/'+ExtractFileName(filep)+'_'+Inttostr(i));
 EMail.Subject := ExtractFileName(filep)+'_'+Inttostr(i);
 smtp1.Connect;

   try
   smtp1.Send(Email);
   smtp1.Disconnect;
   finally
   eMail.MessageParts.Clear;

end;
end;
end;
...
...
...
procedure TForm1.sndButtonClick(Sender: TObject);
 var ThreadID: DWORD;
  ThreadHandle: THandle;
begin
 ThreadHandle:=CreateThread(nil, 0, TFNThreadStartRoutine(@MailThread),
    nil, 0, ThreadID);

      if ThreadHandle<>0 then CloseHandle(ThreadHandle);
end;
...
Es könnte sein, dass ich alles falsch gemacht habe, deshalb seit net zu streng
  Mit Zitat antworten Zitat
skyquaker

Registriert seit: 14. Sep 2006
96 Beiträge
 
Delphi 7 Professional
 
#8

Re: Sendevorgang blockiert meine Software

  Alt 25. Feb 2007, 20:39
@mein vorheriger Post

Außerdem weiß ich nicht wie man die Variabeln übergiebt.
  Mit Zitat antworten Zitat
C.Schoch

Registriert seit: 2. Jan 2006
Ort: Wüstenrot
235 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Sendevorgang blockiert meine Software

  Alt 25. Feb 2007, 21:13
Hi,
Mit CreateThread übergibst du die Parameter direkt nach der Startfunktion:
Delphi-Quellcode:
ThreadHandle:=CreateThread(nil, 0, TFNThreadStartRoutine(@MailThread),
    {hier}, 0, ThreadID);

      if ThreadHandle<>0 then CloseHandle(ThreadHandle);
end;
wenn du mehr als einen Parameter übergeben willst musst du dir einen record denfineren der die Paramter enthällt.
Warum benutzt du nicht den VCL Thread?
Dort kannst du den Constructor überschreiben und dort die Parameter übergeben.
Auserdem würde ich die eMail Komponente dynamisch innerhalb des Threads erstellen damit ersparst du dir den Syncronisierten Zugriff.

P.S.: Du musst auch warten bis der Thread beendet ist bevor du das Handle schliest, sonst hast du keine Möglichkeit mehr auf den Thread zuzugreifen obwohl er noch läuft.
Tschau Christian
Das System hofft auf Besserung
[Siemens]
  Mit Zitat antworten Zitat
skyquaker

Registriert seit: 14. Sep 2006
96 Beiträge
 
Delphi 7 Professional
 
#10

Re: Sendevorgang blockiert meine Software

  Alt 27. Feb 2007, 15:01
Delphi-Quellcode:
unit MailThread;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Controls,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdMessageClient, IdSMTP, StdCtrls, IdIOHandler, IdIOHandlerSocket,
  IdSSLOpenSSL, IdMessage, ComCtrls;

type
  TMailThread = class(TThread)
  private

    procedure MailProc(mail: TIdMessage; path: String; SMTP: TIdSmtp;globalcnt: Integer);
  protected

    procedure Execute(); override;
  public
    constructor Create (CreateSuspended: Boolean; mail: TIdMessage; path: String; SMTP: TIdSmtp;globalcnt: Integer);overload;
  end;

implementation

uses
  atfiles;


var EMail: TIdMessage;
    fPath: String;
    SMTP1: TIdSMTP;
    cnt: Integer;

constructor TMailThread.Create (CreateSuspended : boolean ;mail: TIdMessage; path: String; SMTP: TIdSmtp;globalcnt: Integer) ;
begin
     inherited Create (CreateSuspended) ;
     {Email.Create(nil);}
     {SMTP1.create(nil);}
Email:= TIdMessage.create(Form1);
Smtp1 := TIdSMTP.create(Form1);
  EMail:= mail;
  fPath:= path;
  SMTP1:= SMTP;
  cnt:= globalcnt;
end ;

procedure TMailThread.Execute;
begin
  MailProc(Email, fPath, SMTP1, cnt);
end;

procedure TMailThread.MailProc;
var i: Integer;
begin

for i := 1 to globalcnt -1 do
begin
 if FileExists('./temporary/'+ExtractFileName(path)+'_'+Inttostr(i)) then
    TIdAttachment.Create(mail.MessageParts, './temporary/'+ExtractFileName(path)+'_'+Inttostr(i));
 Mail.Subject := ExtractFileName(path)+'_'+Inttostr(i);
 smtp.Connect;

   try
   smtp.Send(mail);
   smtp.Disconnect;
   finally
   Mail.MessageParts.Clear;
end;
end;



end;

end.
Das ist jetzt meine ThreadUnit, wie binde ich die ein und rufe sie auf? (Das Tutorial hilft mir irgendwie nicht weiter)

EDIT: Ich hab mal versucht es einfach als Procedure aufzurufen (glaub aber das ist total falsch)[kompilieren lässts sich aber]:
TMailThread.Create(true,Email,Opendiag.filename,globalcnt); Außerdem gibt das immer einen Runtime Error, wenn ich .Create(nil) mache, deshalb hab ich das jetzt zu Email:= TIdMessage.create(Form1);
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:22 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