Привет!
Вот такая ситуация: есть программа, которая сообщения в почтовом ящике проверяет ...
все работает, пока сообщений не очень много, и ящиков не более 10 ...
(хотя и при малых количествах информации — тоже растет но не так сильно ...)
Растет в памяти — на 4000 сообщений занимает 300Mb RAM + 300Mb Virtual — это при отключенном сохранении
заголовков в памяти!!! А с ним — на 60 мегов больше ...
Все проверено досконально — глюков с созданием и не удалением объектов — нет!
Тонкость: все действия приема почты идут в нитке (и почему то при старте — 1 нитка а после первой
проверки их уже 3

хотя все нитки выходят коректно) кол-во ниток смотрел по TaskManager XP...
В среднем за одну проверку 4000 писем программа распухает на 300 — 600 метров

и не
худеет
Это сама процедура "нитки":
int _fastcall ThreadCheckAll(Pointer pParam)
{
CoInitialize(NULL);
fMain->CheckAll();
CoUninitialize();
return 0;
}
Это то как она вызывается:
HANDLE handle = (HANDLE)BeginThread(NULL, 0, ThreadCheckAll, NULL, CREATE_SUSPENDED, m_uID);
SetThreadPriority(handle, THREAD_PRIORITY_IDLE);
ResumeThread(handle);
Самое интересное в том что вообще в CheckAll происходит перебор списка серверов и проверяется на них почта.
Найденная почта (заголовки) — записываются в создаваемую структуру (объект) и вкладываются в TList.
При повторной проверке из TList'a все удаляется:
TMimeMess *msg1;
int i;
AnsiString stmp;
i = 0;
while (i<Messages->Count) { // for clear old headers
msg1 = (TMimeMess*) Messages->Items[i];
if (msg1->Header->FindHeader("MBox")==Mbox) {
if (fResetMessagesList) { // флаг о том что пользователь их видел
delete msg1;
Messages->Delete(i);
} else {
i++;
}
} else {
i++;
}
} // end while
бъюсь уже неделю — понять не могу ... прога вылетает, естественно, после 20-30 проверок 10 ящиков по 400 писем ( в памяти дорастает до гигабайтов!!!
Здравствуйте, kris, Вы писали:
K>бъюсь уже неделю — понять не могу ... прога вылетает, естественно, после 20-30 проверок 10 ящиков по 400 писем ( в памяти дорастает до гигабайтов!!!
попробуй создать свой класс-потомок от TThread (там наверняка Визард есть, как в Delphi)
и не забудь в процедуре Thread'а поставить
this->FreeOnTerminate = true;
Форт Ройл — Не впускай зверя
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, kris, Вы писали:
[]
K>K>int _fastcall ThreadCheckAll(Pointer pParam)
K>{
K> CoInitialize(NULL);
K> fMain->CheckAll();
K> CoUninitialize();
K> return 0;
K>}
K>
А вот это не гуд... Сермяжная правда данного куска кода какова?

Зачем из потока вызывать метод главной формы приложения, который отработает в
основном потоке? И потом, к объектам VCL следует обращаться только с использованием метода Synchronize. Так что — либо
действительно вынесите весь рабочий код в функцию потока, либо создайте потомка TThread...
З.Ы. А зачем там CoInitialize ? И еще — соглашение вызова для функции потока, указатель на которую передается в CreateThread, должно быть не __fastcall, а WINAPI (суть __stdcall).
Здравствуйте, Hacker_Delphi, Вы писали:
H_D>this->>FreeOnTerminate = true;
H_D>
Пошел пробовать ...
Здравствуйте, Flamer, Вы писали:
F>З.Ы. А зачем там CoInitialize ? И еще — соглашение вызова для функции потока, указатель на которую передается в CreateThread, должно быть не __fastcall, а WINAPI (суть __stdcall).
угу тока в Delphi/C++ Builder функция BeginThread принимает как раз __fastcall процедуру в качестве параметра

от 0 воздержусь — тебя наверное смутил C++

07
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Здравствуйте, Hacker_Delphi, Вы писали:
[]
H_D>угу тока в Delphi/C++ Builder функция BeginThread принимает как раз __fastcall процедуру в качестве параметра
H_D>от 0 воздержусь — тебя наверное смутил C++
А... Имелась в виду функция из юнита System? Ну тады ой
Здравствуйте, Flamer, Вы писали:
F>А... Имелась в виду функция из юнита System? Ну тады ой 
Им
Енно...
GorkyPark — Moscow Calling ()
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))