Приложение с "нитками" на BCB6 - много памяти потребляет
От: kris  
Дата: 15.01.03 07:40
Оценка:
Привет!

Вот такая ситуация: есть программа, которая сообщения в почтовом ящике проверяет ...
все работает, пока сообщений не очень много, и ящиков не более 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 писем ( в памяти дорастает до гигабайтов!!!
Re: Приложение с "нитками" на BCB6 - много памяти потребляет
От: Hacker_Delphi Россия  
Дата: 15.01.03 08:16
Оценка:
Здравствуйте, kris, Вы писали:

K>бъюсь уже неделю — понять не могу ... прога вылетает, естественно, после 20-30 проверок 10 ящиков по 400 писем ( в памяти дорастает до гигабайтов!!!

попробуй создать свой класс-потомок от TThread (там наверняка Визард есть, как в Delphi)
и не забудь в процедуре Thread'а поставить
this->FreeOnTerminate = true;
Форт Ройл — Не впускай зверя
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re: Приложение с "нитками" на BCB6 - много памяти потребляет
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 15.01.03 08:50
Оценка:
Здравствуйте, 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).
Re[2]: Приложение с "нитками" на BCB6 - много памяти потребл
От: kris  
Дата: 15.01.03 09:11
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:

H_D>
this->>FreeOnTerminate = true;
H_D>


Пошел пробовать ...
Re[2]: Приложение с "нитками" на BCB6 - много памяти потребл
От: Hacker_Delphi Россия  
Дата: 15.01.03 09:47
Оценка:
Здравствуйте, Flamer, Вы писали:

F>З.Ы. А зачем там CoInitialize ? И еще — соглашение вызова для функции потока, указатель на которую передается в CreateThread, должно быть не __fastcall, а WINAPI (суть __stdcall).

угу тока в Delphi/C++ Builder функция BeginThread принимает как раз __fastcall процедуру в качестве параметра
от 0 воздержусь — тебя наверное смутил C++
07
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[3]: Приложение с "нитками" на BCB6 - много памяти потребл
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 15.01.03 09:53
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:

[]
H_D>угу тока в Delphi/C++ Builder функция BeginThread принимает как раз __fastcall процедуру в качестве параметра
H_D>от 0 воздержусь — тебя наверное смутил C++

А... Имелась в виду функция из юнита System? Ну тады ой
Re[4]: Приложение с "нитками" на BCB6 - много памяти потребл
От: Hacker_Delphi Россия  
Дата: 15.01.03 10:09
Оценка:
Здравствуйте, Flamer, Вы писали:

F>А... Имелась в виду функция из юнита System? Ну тады ой

ИмЕнно...
GorkyPark — Moscow Calling ()
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.