[Delphi] pop-wątko-błędy

0

witam,jeszcze troche Wam po truje z tym Pop-em. Napisałem procedurkę do odbierania poczty z jednego konta działającą w wątku,jeśli ją uruchamiam wszystko jest ok,gdy zamykam program jest ok. Ale napisałem podobną ale dla wielu kont i wyskakują mi błędy,oto kod z błędami

begin
nam:=0;
 FreeOnTerminate := True;

 for i:=0 to Form_Mail.Konta.Items.Count-1 do
 if Form_Mail.Konta.Items[i].HasChildren then
 Form_Mail.memo4.Lines.Add(Form_Mail.Konta.Items[i].Text);

for i:=0 to Form_Mail.Memo4.Lines.Count-1 do
BEGIN
 
  Registry := TRegistry.Create(KEY_READ);
  try
    Registry.CloseKey;
    Registry.RootKey:=HKEY_CURRENT_USER;
    Registry.OpenKey(Klucz+'\'+Form_Mail.Memo4.Lines.Strings[i], False);
    Form_Mail.sp := Registry.ReadString('ServerNamePop');
    Form_Mail.pp := Registry.ReadString('ServerPortPop');
    Form_Mail.lp := Registry.ReadString('ServerUserPop');
    Form_Mail.hp := Registry.ReadString('ServerPasswordPop');
    finally
    Registry.Free;
  end;
           
  with Form_Mail do
   Begin
  // StatusBar.Panels.Items[1].Text:=Memo4.Lines.Strings[i]+' - Łączenie'  ;

   if  POP.Connected then
   POP.Disconnect;

    POP.Host := Form_Mail.sp;
    POP.Port := strtoint(Form_Mail.pp);
    POP.Username := Form_Mail.lp;
    POP.Password := Form_Mail.hp;
   try
    POP.Connect;
   except
    //StatusBar.Panels.Items[1].Text:=Memo4.Lines.Strings[i]+' - Błąd'  ;
   end;

   FMsgCount :=  POP.CheckMessages;
   FMailBoxSize :=  POP.RetrieveMailBoxSize div 1024;
   Mail_P.Max:=FMsgCount;
   Mail_P.Position:=0;
   if FMsgCount > 0 then
      begin
         if Form_Main.JestPoczta=False then
         Begin
        // Procedury.Mow('Masz nową wiadomość');
         Form_Main.Timer4.Enabled:=True;
         End;

         for intIndex := 1 to FMsgCount do
         begin
         Msg.Clear;
      
         while FileExists(Form_Main.Sciezka+'Poczta\'+Form_Mail.Memo4.Lines.Strings[i]+'\Skrzynka odbiorcza\'+inttostr(Nam)+'.kma') do inc(Nam);
         if Pop.Retrieve(intIndex, Msg) then
         Msg.SaveToFile(Form_Main.Sciezka+'Poczta\'+Form_Mail.Memo4.Lines.Strings[i]+'\Skrzynka odbiorcza\'+inttostr(Nam)+'.kma');

         itm := List2.Items.Add;
         itm.Caption := Msg.Subject;
         itm.SubItems.Add(Msg.From.Text);
         itm.SubItems.Add(DateToStr(Msg.Date));
         itm.SubItems.Add(IntToStr( POP.RetrieveMsgSize(intIndex)));
         itm.SubItems.Add(inttostr(Nam)+'.kma');
         itm.SubItems.Add(Memo4.Lines.Strings[i]);
         Mail_P.Position:=intIndex;

       //  StatusBar.Panels.Items[1].Text := format('Nowe wiadomosci: '+IntToStr(FMsgCount)+'.Łączny rozmiar: %d KB ', [FMailBoxSize]);
       
         end; // for i to message count
     end // if msg>0
   else
      begin
        // StatusBar.Panels.Items[1].Text:='Brak wiadomosci';
      end;

  //    EXCEPT
  //    StatusBar.Panels.Items[1].Text:='Błąd ...';
  //    END;

     Form_Main.JestPoczta:=False;

   End; // with form mail do

END; // for i to memo4.lines.count

   PopAll.Terminate;
   if terminated then
   Form_mail.Label18.caption:='Watki przerwane';

end;

zaraz po uruchomieniu wyskakują mi błędy,może związane z memo "canvas does not allow drawing" i wszystko się wykrzacza , albo gdy jakoś to ominę to potem "nieprawidłowe dojście okna , system error 1400 " - chyba oznacza nieprawidłowy uchwyt okna

czy ktoś może tu pomóć ? co może to powodować

0

A jaki masz system? I czy <ort>kozystasz </ort>z jakis dodatkowych komponentow graficznych? Bo ja mialem Canvas does not allow drawing jak <ort>kozystalem </ort>w programie z komponentow TjvXP... jak pozmienialem wszystkie TjvXPCheckbox itp na TChceckbox to przeszlo :)

0

chyba już wiem.miałem na formie listview na pagecontrolu który nie był widocznu(listview),a podczas pobierania wiadomości dodawałem do niego itemy.zamieniłem memo na stringlist a itemów nie dodaję przy odbieraniu tylko zapisuje wiadomości do pliku i odczytuje póżniej podczas kliknięcia np. na skrzynkę odbiorczą. i na razie jakoś działa,ale dzięki [soczek]

0

odpowiedź jest dość prosta - wątki nigdy nie powinny zmieniać właściwości komponentów wizualnych; powinno się to odbywać za pośrednictwem np. metody synchronize(), która wymusza wykonanie danej operacji w kontekście wątku vcl.

[dopisane]
cóż, mógłbyś sam ruszyć głową.

w klasie wątku masz zmienną, np. s:string, oraz metodę, np. setcaption(s2:string) i setcaption2;

procedure tmythread.setcaption(s2:string);
begin
  s := s2;
  synchronize(setcaption2);
end;

procedure tmythread.setcaption2;
begin
  label1.caption := s;
end;

być moze są łatwiejsze sposoby...

0

ŁF dzięki - troche mnie oświeciłeś bo nie miałem pojęcia dlaczego tak jest.pokusiłbyś się o fragment kodu jak można by np. poprawnie (tzn. metadą synchronize zmieniać captiony itp) żeby nie powodowało to podobnych problemów ?

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