Форум: "Основная";
Текущий архив: 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]Ты вообще ТЗ в состоянии привести хоть в каком бы то ни было виде ?
← →
fishka (2006-08-09 14:45) [41]
> это процедура обработки события таймера
> Насколько я понимаю, клик кнопки должен вызвать немедленное
> чтение почты и запуск таймерного механизма повтора этого
> "действа" .. Я прав ?
Конечно.
Но программа должна работать и без таймера. - Вот и все ТЗ.
> это процедура обработки события таймера
Опять прав. Просто был текст другой........
← →
Сергей М. © (2006-08-09 14:54) [42]
> программа должна работать и без таймера. - Вот и все ТЗ
Фтопку такое ТЗ.
Или программу, даже такое ТЗ не выполняющую.
Спрашивается, что должен думать юзер, видящий одну-единственную кнопку на форме ? То ли жмакнув ее он запустит чтение почты однократно, то ли многократно периодически ..
Короче, продумай ТЗ, езжай в "Начинающие" и повтори вопрос.
← →
fishka (2006-08-09 15:36) [43]Юзер ничего не подумает. Но может отключить таймер и сам запускать чтение из почты нажатием на кнопку. Вообще-то прога работает уже несколько месяцев, только после некоторых писем (которые почему-то всегда спам), не подключается к ящику, и приходится ее закрывать и открывать. А вообще прога должна работа без участия человека.
← →
Сергей М. © (2006-08-09 15:40) [44]
> Но может отключить таймер
Чем ?
Чем он включает таймер ? Чем он его отключает ?
Тобой упомянута лишь одна кнопка..
← →
fishka (2006-08-09 15:43) [45]CheckBox (и не только) есть на форме. Речь идет об ошибке, а не ТЗ на программу.
← →
Сергей М. © (2006-08-09 15:59) [46]
> Речь идет об ошибке, а не ТЗ на программу
Твоя ошибка растет именно из-за несуразного проектирования программы, которое есть следствие туманного ТЗ)
← →
Slym © (2006-08-09 16:05) [47]Требую отделить чекбоксы от popEmail!
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.049 c