Wątki

0

Mam problem z "zawątkowaniem" mojego kodu. Proszę o pomoc (czyt. konkretny kod źródłowy, a nie wskazówki, które moge przeczytać w artykule. Z góry dziękuję za pomoc. PS. Czy da się tak zawątkować program, żeby łączył się z serwerem SMTP kilkoma sesjami na raz?

Kod do zawątkowania:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
   x,i : integer;
   idMessage : TIdMessage;
   begin
   {SPRAWDZANIE POPRAWNOŚCI}

     x := 0;

  if (host.Text = '') then
  application.MessageBox('Nie podałeś nazwy hosta.','Uwaga',MB_Ok + MB_IconExclamation)
  else x := x + 1;

  if (login.Text = '') then
  application.MessageBox('Nie podałeś swojego loginu.','Uwaga',MB_Ok + MB_IconExclamation)
  else x := x + 1;

  if (pass.Text = '') then
  application.MessageBox('Nie podałeś swojego hasła.','Uwaga',MB_Ok + MB_IconExclamation)
  else x := x + 1;

  if (od.Text = '') then
  application.MessageBox('Nie podałeś adresu e-mail nadawcy listu.','Uwaga',MB_Ok + MB_IconExclamation)
  else x := x + 1;

  if (dokogo.Text = '') then
  application.MessageBox('Nie podałeś adresu e-mail odbiorcy listu.','Uwaga',MB_Ok + MB_IconExclamation)
  else x := x + 1;

  if (temat.Text = '') then
  application.MessageBox('Nie podałeś tematu listu.','Uwaga',MB_Ok + MB_IconExclamation)
  else x := x + 1;

  if ile.Text = '' then
  application.MessageBox('Nie podałeś ilości e-maili.','Uwaga',MB_Ok + MB_IconExclamation)
  else if StrToInt(ile.Text) = 0 then
  application.MessageBox('List nie zostanie wysłany.','Uwaga',MB_Ok + MB_IconExclamation)
  else x := x + 1;

  if timeout.Text = '' then
  application.MessageBox('Nie podałeś opóźnienia.','Uwaga',MB_Ok + MB_IconExclamation)
  else x := x + 1;

   {KONIEC SPRAWDZANIA}

if x = 8 then
  begin
     idMessage := TIdMessage.Create(self);
     idMessage.Body.Assign(mail.Lines);
     idMessage.From.Text := od.Text;
     idMessage.Recipients.EMailAddresses := od.Text;
     idMessage.ccList.EMailAddresses := '';
     idMessage.BccList.EMailAddresses := '';
     idMessage.Subject := temat.Text;
     idsmtp1.Host := host.Text;
     idsmtp1.Port := 25;
     idsmtp1.Username := login.Text;
     idsmtp1.Password := pass.Text;
     p.MaxValue := StrToInt(ile.Text);
     stat.SimpleText := '';
     idsmtp1.Connect;
     idsmtp1.AuthenticationType := atLogin;
     idsmtp1.Authenticate;
     i := 0;
     p.Progress := 0;
     while i < StrToInt(ile.Text) do
     begin
     idsmtp1.Send(idMessage);
     p.Progress := p.Progress + 1;
     sleep(StrToInt(timeout.Text));
     i := i + 1;
     end;
     idsmtp1.AuthenticationType := atNone;
     idsmtp1.Disconnect;
     idMessage.Free;
  end

else
stat.SimpleText := ' (> Nie wysłano wiadomości.';
end;
0
  1. po co ci watki?? Tzn, laczenie sie w kilku watkach??

// a juz widze, po prostu napisz funkcje ktora bedzie lapac jako parametry tekst do wyslania i zwracac czy sie powiodlo - proste i logiczne

  1. po co uzywasz zmiennej x - przeciez mozna uzyc exit;
  2. nikomu nie bedzie sie chcialo czytac dlugiego kodu
  3. czytales posta lofixa na poczatku?? tam jest zeby nie prosic o kod, forum jest zeby wspomoc duchowo i intelektualnie.

niewiem jaki serwer - juz prawie nie ma takich, nie potrzebuje uwierzytelniania do wysylania, a jak masz to mozesz podac, jestem ciekaw

0

z tego co rozumiem to nie umiesz robi? wątków :-8 . Nalezałoby przeczytać jaki? artykulik (np. na 4programmers). A co do tych sesji to kilka razy wywolać wątek nie wystarczy??

var
	watek: TWatek;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
	watek := TWatek.Create(false);
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
	watek.Terminate;
end;


procedure TWatek.SendMsg;
var
	x, i: integer;
	idMessage : TIdMessage;
begin
	with Form1 do
	begin
		{SPRAWDZANIE POPRAWNO?CI}
		 x := 0;
	
		  if (host.Text = '') then
		  application.MessageBox('Nie poda?e? nazwy hosta.','Uwaga',MB_Ok + MB_IconExclamation)
		  else x := x + 1;
		
		  if (login.Text = '') then
		  application.MessageBox('Nie poda?e? swojego loginu.','Uwaga',MB_Ok + MB_IconExclamation)
		  else x := x + 1;
		
		  if (pass.Text = '') then
		  application.MessageBox('Nie poda?e? swojego has?a.','Uwaga',MB_Ok + MB_IconExclamation)
		  else x := x + 1;
		
		  if (od.Text = '') then
		  application.MessageBox('Nie poda?e? adresu e-mail nadawcy listu.','Uwaga',MB_Ok + MB_IconExclamation)
		  else x := x + 1;
		
		  if (dokogo.Text = '') then
		  application.MessageBox('Nie poda?e? adresu e-mail odbiorcy listu.','Uwaga',MB_Ok + MB_IconExclamation)
		  else x := x + 1;
		
		  if (temat.Text = '') then
		  application.MessageBox('Nie poda?e? tematu listu.','Uwaga',MB_Ok + MB_IconExclamation)
		  else x := x + 1;
		
		  if ile.Text = '' then
		  application.MessageBox('Nie poda?e? ilo?ci e-maili.','Uwaga',MB_Ok + MB_IconExclamation)
		  else if StrToInt(ile.Text) = 0 then
		  application.MessageBox('List nie zostanie wys?any.','Uwaga',MB_Ok + MB_IconExclamation)
		  else x := x + 1;
		
		  if timeout.Text = '' then
		  application.MessageBox('Nie poda?e? opó?nienia.','Uwaga',MB_Ok + MB_IconExclamation)
		  else x := x + 1;
	
	   {KONIEC SPRAWDZANIA}
	
		if x = 8 then
		  begin
			 idMessage := TIdMessage.Create(self);
			 idMessage.Body.Assign(mail.Lines);
			 idMessage.From.Text := od.Text;
			 idMessage.Recipients.EMailAddresses := od.Text;
			 idMessage.ccList.EMailAddresses := '';
			 idMessage.BccList.EMailAddresses := '';
			 idMessage.Subject := temat.Text;
			 idsmtp1.Host := host.Text;
			 idsmtp1.Port := 25;
			 idsmtp1.Username := login.Text;
			 idsmtp1.Password := pass.Text;
			 p.MaxValue := StrToInt(ile.Text);
			 stat.SimpleText := '';
			 idsmtp1.Connect;
			 idsmtp1.AuthenticationType := atLogin;
			 idsmtp1.Authenticate;
			 i := 0;
			 p.Progress := 0;
			 while i < StrToInt(ile.Text) do
			 begin
			 idsmtp1.Send(idMessage);
			 p.Progress := p.Progress + 1;
			 sleep(StrToInt(timeout.Text));
			 i := i + 1;
			 end;
			 idsmtp1.AuthenticationType := atNone;
			 idsmtp1.Disconnect;
			 idMessage.Free;
		end
		else
			stat.SimpleText := ' (> Nie wys?ano wiadomo?ci.';
	end;
end;

procedure TWatek.Execute;
begin
	FreeOnTerminate:=true;
	Synchronize(SendMsg);
end;
0

Ok, to może jeszcze raz.

  1. Ten kod jest ok, chodzi o to, że jak wysyłam pocztę program się "zacina" i nie reaguje na np. wciśnięcie przycisku "Przerwij". Chodzi o to, żeby wysylanie działało sobie "w tle" (cytuję z artykułu o wątkach Adama Boducha).

  2. Serwer nie wymagający uwierzytelnienia - smtp.o2.pl (chyba)

0

Ludomir, thx za zrozumienie :) A teraz zła wiadomość: bugi. Daję report z debugera:

Build
[Error] Unit1.pas(64): Undeclared identifier: 'TWatek'
[Error] Unit1.pas(66): Missing operator or semicolon
[Error] Unit1.pas(66): Incompatible types: 'TComponent' and 'Boolean'
[Error] Unit1.pas(69): Identifier expected but '.' found
[Error] Unit1.pas(117): Undeclared identifier: 'self'
[Error] Unit1.pas(151): ';' expected but '.' found
[Error] Unit1.pas(153): Undeclared identifier: 'FreeOnTerminate'
[Error] Unit1.pas(154): Missing operator or semicolon
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

Przedostatni potrafię naprawić. Z góry dzięki za wszystko. Rzeczywiście nie miałem czasu żeby testować sobie program w oparciu o sam artykuł, chodziaż go czytałem.

0
  1. Serwer nie wymagający uwierzytelnienia - smtp.o2.pl (chyba)

z tego co wiem, i mam tam konto to od niedawna wymaga uwierzytalnienia i poza tym adres jest poczta.o2.pl a nie smtp.o2.pl.

co do tego zeby dalo sie wcisnac przerwij po prostu dodaj w petli application.processmessages. po co ci watki. tak bedzie jeden, ale w tym miejscu aplikacja bedzie obslugiwala inne komunikaty.

0

problem rozwiązany. kolega patyk zagadał na gg i doszliśmy do końca z tymi wątkami.

0

Ok już Ludomir mi pomógł, nie musicie odpowiadać.

0

Do kolegi n_a_v_ :

Tak, rzeczywiście portral o2 wprowadził nowe serwery (poczta.o2.pl), ale serwer smtp.o2.pl nadal istnieje i... nie wymaga uwierzytelnienia i o dziwo ... nadal działa! Tak mi się przynajmniej wydaje. Nie sprawdzałem z pop3.o2.pl.

1 użytkowników online, w tym zalogowanych: 0, gości: 1