Russian Qt Forum
Май 29, 2024, 12:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QList + потоки очистка памяти  (Прочитано 2694 раз)
vanchen
Гость
« : Апрель 25, 2010, 13:44 »

Здравствуйте, уважаемые!
У меня 2 потока. один пишет в QList другой оттуда читает и обрабатывает. Работают на mutex и waitcondition.
Все работает, все хорошо. НО! Как только размер List сильно возрастает например до 1 гига. Память после его обработки не очищается или очищается не полностью. Причем так происходит когда с данными работает функция Parce.
Вот код:

Обрабатывающий поток:
Код:
void ReadThread::run()
{
        ushort portS;
        ushort portD;
        QString sourceIP;
        QString targetIP;        
        while (!stopped || getUsedSpace()!=0)
{
            mutexLock();
while (getUsedSpace() == 0)
{
threadWait();
if (stopped)
break;
}
                if (stopped && getUsedSpace()==0)
{
mutexUnlock();
break;
}
               pkt_data=&(getPacListAt(0)->pkt[0]);
                        iph=((ip_header*)pkt_data);
               if (iph->type!=0)
{
               portS=*((ushort*)(pkt_data+34));
                 portD=*((ushort*)(pkt_data+36));
                revert(portS);
                revert(portD);
                 ToIPString(iph->sourceIP, sourceIP);
                 ToIPString(iph->targetIP, targetIP);
                parce(sourceIP, targetIP,pkt_data, portS, portD, getPacListAt(0)->header);
            }
                delPacListAt(0);
mutexUnlock();
}
stopped=false;
}

Читающий поток:
Код:
void ScanThread::run()
{
while (!stopped)
{
mutexLock();
                                        pacListAdd(tpkt_data, header);
                                        threadWakeAll();
mutexUnlock();
                        }

threadWakeAll();
stopped=false;
}


Функция parce:
Код:
bool ReadThread::parce(const QString &sourceIP, const QString &targetIP,uchar *pkt_data, ushort & portS, ushort & portD, pcap_pkthdr & header)
{
       destIPAdd(targetIP,portD);
}

Код:
void ReadThread::destIPAdd(const QString &IP, const ushort &port)
{
if (!isFromNetwork(IP))
               if (!destIP.contains(IP) && (port>1000 || port==80 || port==8080 || port==443))
{
                        destIP.insert(IP, port);
                        emit SdestIPAdd(IP, port);
}
        }

Функции работы со списком:
Код:
struct packet
{
                         pcap_pkthdr header;
                         u_char pkt[pkt_len];
                        };
static QList<packet *> pacList;


 void Global::pacListAdd(const u_char *pkt_data, pcap_pkthdr *h)
{
    if (h->len<2000)
    {
        packet * p=new packet;
       p->header=*h;
        const u_char *ppkt_data=pkt_data;
        for (uint i=0;i<h->len;i++)
                p.pkt[i]=*ppkt_data++;
        pacList.append(p);
        p=NULL;
    }
}

 void Global::delPacListAt(int pos)
{
     delete pacList[pos];
        pacList.removeAt(pos);
}

Если убрать все функции обработки и оставить только заполнение + обработку все работает отлично.
Потоки самозабвенно сражаются за память, все чиститься.
Но с функцией память либо вообще не чиститься либо не полностью.
Причем!!! Если в функции обработки добавить : QString Data=""; а остальное убрать, куски памяти все равно чиститься не будут!
Сломал на этом мозг!
Работает все это на Linux. За ответы заранее спасибо!)
« Последнее редактирование: Апрель 25, 2010, 13:46 от vanchen » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.038 секунд. Запросов: 17.