Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.24;
Скачать: CL | DM;

Вниз

TIdPOP3 .Connect - ошибка Thread creation error. Not...   Найти похожие ветки 

 
fishka   (2006-08-08 11:37) [0]

Программа считывает из почтового ящика сообщения и записывает их (текст, уникальный номер, дату)  в таблицу Ms SQL. Все работает нормально, пока не придет спам. При этом после окончания цикла необходимо сделать disConnect (чтобы удалились письма), но потом на строчке:
IdPOP3 .Connect - возникает ошибка Thread creation error. Not enough storage is avaiable to process this command.
И коннекта не происходит, такое происходит не после каждого спама, но понять я не могу, в чем причина. Если нет спама, то все работает без сбоев.
Try .. except - везде стоят.
Что нужно почистить, настроить....?


 
Сергей М. ©   (2006-08-08 11:40) [1]

Чем спам отличается от НЕспама ?


 
fishka   (2006-08-08 11:45) [2]

Чем спам отличается от НЕспама ?
1. возможной некорректностью свойств (текст, уникальный номер, дата)
2. возможной ошибкой при декодировании (id64.DecodeToString)
3. нет необходимости работать со спамом дальше (записывать в другую таблицу)
4.не знаю.......


 
fishka   (2006-08-08 11:47) [3]

Наверное, более корректный вопрос, ответ на который я не знаю:
чем нормальный спам (после которого идет коннект) отличается от спама, после которого нет коннекта.


 
stone ©   (2006-08-08 11:58) [4]


> fishka  

Содержимое проверяет не IdPOP3. Так что содержимое ящика не должно влиять на попытку подключения. Проверь состояние IdPOP3 перед попыткой подключения, может он уже и так подключен.


 
Сергей М. ©   (2006-08-08 12:01) [5]


> fishka   (08.08.06 11:47) [3]


> чем нормальный спам (после которого идет коннект) отличается
> от спама, после которого нет коннекта


Ничем.
Просто у тебя ошибка в программе.


 
fishka   (2006-08-08 12:07) [6]

stone ©   (08.08.06 11:58) [4]
Проверяю (вроде как)
Сергей М. ©   (08.08.06 12:01) [5]
А как найти, где ошибка?

Если нет "хитрого" спама, то программа работает нормально (до 3 суток включительно были случаи без сбоев). Писем за сутки чуть больше 10 тысяч.


 
Сергей М. ©   (2006-08-08 12:11) [7]


> как найти, где ошибка?


Ну как ? Просмотреть внимательно исх.код, отладчиком воспользоваться ..

Подозреваю, что при том самом "хитром" спаме не каждый connect у тебя сопровождается обязательным дисконнектом, и в какой-то момент ресурсы процесса, требуемые для создания очередного доп.потока, оказываются исчерпанными, о чем недвусмысленно и намекает сообщение об ошибке.


 
fishka   (2006-08-08 12:19) [8]

Смотрю внимательно исх.код, отладчиком пользуюсь. Текст ошибки в вопросе. "в какой-то момент ресурсы процесса, требуемые для создания очередного доп.потока , оказываются исчерпанными" - это понятно.
"не каждый connect у тебя сопровождается обязательным дисконнектом" - скорее всего так. Я же проверяю, коннектед или нет.
Я спрашиваю, что мне настроить, почистить...?


 
Сергей М. ©   (2006-08-08 12:26) [9]

Общая схема д.б. такова:

Connect
try
.. прием и обработка почт.сообщений ..
finally
 Disconnect
end;


 
fishka   (2006-08-08 12:38) [10]

if not popEmail.Connected then
begin
try   //Connect
popEmail.Connect;
for количество писем    
  try
    read_Email(i);
   except
    memo1.Lines.add("Ошибка чтения письма");
   end;
 end;//for
memo1.Lines.add("Çàïèñàíî â pos "+IntToStr(count_pos));

except
      on E: Exception do
       begin
        memo1.Lines.add(E.Message+" "+DatetimeToStr(now));
        popEmail.Disconnect;
        sleep(10000);
       end;
end;

try
 popEmail.Disconnect;
except
end;
end; // if connected


У меня здесь где-то ошибка?
Сергей М. ©   (08.08.06 12:26)  
Ваша дата рождения для подтверждения ошибки в поле типа даты БД анкет?


 
Сергей М. ©   (2006-08-08 12:51) [11]

popEmail.Connect;
try
 for i := 0 to количество писем - 1 do
 try
   read_Email(i);
  except
   .. здесь д.б. анализ класса/текста исключения ..
   raise; //если исключение не связано с некорректностью заголовка и/или содержимого письма
  end;
finally
  popEmail.Disconnect;
end;


 
fishka   (2006-08-08 12:56) [12]

д.б. try popEmail.Connect; Иначе если нет сети или перезагрузка, то вывалится ошибка.
Буду что-то менять, не знаю пока что........


 
Сергей М. ©   (2006-08-08 12:58) [13]


> Иначе если нет сети или перезагрузка, то вывалится ошибка


Это на здоровье)
Главное чтобы disconnect был в finally


 
fishka   (2006-08-08 13:58) [14]

>Иначе если нет сети или перезагрузка, то вывалится ошибка
Это на здоровье<
Нет. Программа должна работать. И как только появится сеть и/или почтовый сервер, она должна считывать данные без вмешательства человека.


 
Сергей М. ©   (2006-08-08 14:05) [15]


> fishka   (08.08.06 13:58) [14]


while True do
try
  Connect()
  try
    ...
  finally
    Disconnect;
  end;
except
  ...
end;


 
fishka   (2006-08-08 14:51) [16]

Буду использовать finally. Как (если?) перестанет работать, напишу. Спасибо за поддержку.
Остался без ответа один вопрос о дате рождения отвечающего...


 
Сергей М. ©   (2006-08-08 15:06) [17]


> fishka   (08.08.06 14:51) [16]


Вот она тебе далась) ...
Не суть как важно, главное - не при царе Горохе)


 
fishka   (2006-08-08 15:46) [18]

Главное, в тот день, которого не бывает. 30 февраля, год тут не (ни?) при чем.


 
Сергей М. ©   (2006-08-08 16:12) [19]

Надо же, какой ты догадливый)


 
fishka   (2006-08-09 11:30) [20]

Программа вывалилась с той же ошибкой сегодня. За вчерашний день спамов было порядка 9. Но вывалилась на одном.

if (popEmail.Connected) then popEmail.Disconnect
else
begin
BitBtn1.Enabled:=False;
try   //Connect
popEmail.Connect;
if popEmail.CheckMessages >0  then
begin
if (popEmail.CheckMessages>1000) then pp:=1000 else     pp:=popEmail.CheckMessages;
ProgressBar1.Max:=pp;
for i:=1 to pp do  begin
   ProgressBar1.Position:=ProgressBar1.Position+1;
   Application.ProcessMessages;
   try
    read_Email(i);
   except
   end;
 end;//for
 end; //if

finally
 BitBtn1.Enabled:=True;
 popEmail.Disconnect;
end;
end; // if connected


В чем ошибка?


 
Slym ©   (2006-08-09 11:37) [21]

fishka   (09.08.06 11:30) [20]
А кто тебе сказал что ошибка ЗдисЪ? может тут и нет ошибки... может ошибка в загадочном read_Email(i);


 
Сергей М. ©   (2006-08-09 11:40) [22]

Покажи что у тебя творится в Read_Email() ..


 
fishka   (2006-08-09 11:44) [23]

Если идти по F7, то возвращаемся в цикл for. Доходим до конца, потом по  таймеру опять запускается. И уже тогда на строке popEmail.Connect;
вываливается вышеописанная ошибка.
Read_Email() - там много всего.


 
Сергей М. ©   (2006-08-09 11:53) [24]

Ах вон оно что !)

Убирай нафиг Application.ProcessMessages либо запрещай работу таймера на момент выполшнения этого алгоритма.


 
fishka   (2006-08-09 12:01) [25]

Сейчас написано так:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if BitBtn1.Enabled then
begin
BitBtn1Click(Form1);
end;
end;

Этого недостаточно?
Убирать Application.ProcessMessages - не хочу. Хочу процентную линейку!


 
Slym ©   (2006-08-09 12:11) [26]

Динамически внутри процедуры создавай свой popEmail и работай


 
fishka   (2006-08-09 12:31) [27]


> Динамически внутри процедуры создавай свой popEmail и работай


А создание popEmail по времени долго (мне так кажется). Где создавать в таймере?


 
Сергей М. ©   (2006-08-09 12:43) [28]


> Этого недостаточно?


Нет , не достаточно.

Запрещай работу таймера прямо в процедуре чтения почты.


> Убирать Application.ProcessMessages - не хочу. Хочу процентную
> линейку


Для этого есть метод ProgressBar.Update.

Кр.того, если без обработки событий ввода-вывода в момент чтения почты никак не обойтись, можно бросить на форму IdAntifreeze - он "оживит" интерфейс пользователя.


> создание popEmail по времени долго (мне так кажется)


Глупости)

К тому же это время несравнимо меньше периода срабатывания твоего таймера.


 
fishka   (2006-08-09 12:53) [29]

1. В процедуре чтения писем вставлено:
Timer1.Enabled:=False;
2.Заменено на ProgressBar.Update
3.IdAntifreeze есть на форме.
4.
> создание popEmail

Хочется обойтись без этого.

Что еще надо сделать?
Если ничего, то буду ждать результатов.


 
Slym ©   (2006-08-09 12:58) [30]

Проверку почты в поток!
в нем Event.WaitFor(TimeOut) - заменит таймер


 
Сергей М. ©   (2006-08-09 12:58) [31]

Если

> 2.Заменено на ProgressBar.Update


то никакие антифризы и прочие ProcessMessages не нужны, при условии что не требуется реакция на события ввода.


 
fishka   (2006-08-09 13:12) [32]

> не требуется реакция на события ввода
не знаю, может и потребоваться.
Буду ждать результатов. Раньше было до 3 суток работало все стабильно. Если перестанет коннектиться, напишу.


 
Сергей М. ©   (2006-08-09 13:16) [33]


> fishka   (09.08.06 13:12) [32]


Ты лучше объясни, в какой момент таймер у тебя должен включаться ... Мне это пока не понятно из твоих объяснений ...


 
fishka   (2006-08-09 13:40) [34]

Таймер через 10 сек (если предыдущие письма обработаны).


 
Сергей М. ©   (2006-08-09 13:46) [35]

Я не спрашиваю про период таймера)
Меня интересует, когда он включается..


 
fishka   (2006-08-09 13:49) [36]

Не понимаю вопроса.......
Таймер включается по времени через 10 сек (если предыдущие письма обработаны). В нем процедура нажатия кнопки, в которой то, что написано
(09.08.06 11:30) [20] .


 
Сергей М. ©   (2006-08-09 14:00) [37]


> Не понимаю вопроса


Что тут непонятного ?

Таймер включается установкой св-ва Enabled = True

При нажатии кнопки у тебя запускается собственно чтение почты, каковое не имеет отношения к таймеру. Ну а где и в какой момент у тебя включается таймер ?


 
fishka   (2006-08-09 14:12) [38]

fishka   (09.08.06 11:30) [20]
Это процедура нажатия на кнопку.
fishka   (09.08.06 12:01) [25]
Это процедура включения таймера
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if BitBtn1.Enabled then
begin
BitBtn1Click(Form1);
end;
end;

fishka   (09.08.06 12:53) [29]
1. В процедуре чтения писем вставлено Timer1.Enabled:=False;

а потом Timer1.Enabled:=True; (после чтения всех писем).

Понятно?


 
Сергей М. ©   (2006-08-09 14:24) [39]


> Это процедура включения таймера
> procedure TForm1.Timer1Timer(Sender: TObject);


Ну что ты городишь, а ?)
Это НЕ процедура включения таймера - это процедура обработки события таймера ! Она вызывается не иначе когда таймер УЖЕ включен) ..


> 1. В процедуре чтения писем вставлено Timer1.Enabled:=False;
> ..
> а потом Timer1.Enabled:=True


ВОТ оно - управление "включенностью" таймера !)

Еще раз объясни требуемую логику.
Насколько я понимаю, клик кнопки должен вызвать немедленное чтение почты и запуск таймерного механизма повтора этого "действа" .. Я прав ?


 
Сергей М. ©   (2006-08-09 14:30) [40]

Ты вообще ТЗ в состоянии привести хоть в каком бы то ни было виде ?



Страницы: 1 2 вся ветка

Текущий архив: 2006.09.24;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.031 c
15-1157519711
Pazitron_Brain
2006-09-06 09:15
2006.09.24
Коммунальная служба не дает доступ к крыше!


15-1157438920
iii
2006-09-05 10:48
2006.09.24
Статус...


2-1157627610
lessard
2006-09-07 15:13
2006.09.24
Определить содержимое variant


2-1157392733
serko
2006-09-04 21:58
2006.09.24
Мигание формы!


2-1157412618
Fly`
2006-09-05 03:30
2006.09.24
запустить приложение сразу в tray