Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.043 c
2-1157266289
Mozgan
2006-09-03 10:51
2006.09.24
Числа


3-1153320083
SamProf
2006-07-19 18:41
2006.09.24
Как обновить данные в таблице


2-1156642642
Juri
2006-08-27 05:37
2006.09.24
Помогите профильтровать базу данных по дате


15-1157100888
Dbn
2006-09-01 12:54
2006.09.24
С праздником, друзья!


9-1135614705
Ford
2005-12-26 19:31
2006.09.24
Книга DirectX





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский