Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TerminateThread, Поток убивается, но не освобождает памят 
:(
    Опции темы
knark
Дата 13.4.2007, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 21.1.2006

Репутация: нет
Всего: нет



Суть в том, что мне надо создать максимум потоков, потом заставить их сделать сложный запрос к базе данных, потом их все убить, и снова создать столько же потоков, и опять отправлять запросы. Винда мне дает выделить порядка двух штук потоков. После этого я их убиваю в цикле.
Код

while(ThreadList.GetCount()){
            HANDLE HndlToThread;
            HndlToThread = ThreadList.GetHead();
            if(TerminateThread(HndlToThread,0)){
                ThreadList.RemoveHead();
                CloseHandle(HndlToThread);
            }

        }


Но потом винда мне не дает больше создавать их. Постоянно отказывает.
Код

for(j=0;j < 2100;j++){
            HANDLE HndlToThread;
            HndlToThread = CreateThread(NULL,  // no security attributes 
                          0,                // use default stack size 
                             (LPTHREAD_START_ROUTINE) SendRequest, 
                             (LPVOID) 0, // param to thread func 
                             0, // creation flag 
                             new DWORD);       // thread identifier 
            if(HndlToThread!=0){
                i++;
                ThreadList.AddTail(HndlToThread);
            }
        }



Как убить поток и освободить ресурсы от него.
PM MAIL   Вверх
Greeen
Дата 13.4.2007, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 710
Регистрация: 13.8.2006
Где: Петербург

Репутация: 10
Всего: 18



НИКОГДА не следует пользоваться функцией TerminateThread. Организуй логику так чтобы поток уничтожал сам себя.
P.S. и не думай что чем больше у тебя потоков, тем эффективней будет твоя программа. 2000 тредов это просто кошмар.


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
knark
Дата 13.4.2007, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 21.1.2006

Репутация: нет
Всего: нет



Логика не катит. Дело в том что в треде запускается запрос к базе данных, тяжелый запрос. Мне надо прервать его.
Код

void SendRequest(){
    TRY
    {
        Db.ExecuteSQL( strCmd );
    }

    CATCH(CDBException, e)
    {
        cout << "Execute Exception " << i;
        exit(0);
    }
    END_CATCH
}


Без TerminateThread не обойтись.
PM MAIL   Вверх
Greeen
Дата 13.4.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 710
Регистрация: 13.8.2006
Где: Петербург

Репутация: 10
Всего: 18



Хм.. то есть ты хочешь завершить тред в процессе выполнения ExecuteSQL?


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
knark
Дата 13.4.2007, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 21.1.2006

Репутация: нет
Всего: нет



Да
PM MAIL   Вверх
Greeen
Дата 13.4.2007, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 710
Регистрация: 13.8.2006
Где: Петербург

Репутация: 10
Всего: 18



Что тут посоветуешь. Разбить запрос на небольшие и в промежутках между ними проверять, а не пора ли мне (потоку) умирать. Иначе TerminateThread, но это конечно наихудшее решение.


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
knark
Дата 13.4.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 21.1.2006

Репутация: нет
Всего: нет



Мне нужно узнать, сколько база данных сможет выдержать запросов. Суть в том что мне как раз надо что бы запрос выполянлся на ней, а на моем компе, он должен умереть, что бы освободить тред, для нового запроса.
PM MAIL   Вверх
Nuzur
Дата 13.4.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



knark, а что за БД?


--------------------
Never again...
PM MAIL   Вверх
Greeen
Дата 13.4.2007, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 710
Регистрация: 13.8.2006
Где: Петербург

Репутация: 10
Всего: 18



knark, не самый лучший способ узнать производительность субд ИМХО


--------------------
Подпись больше не нужна
PM MAIL ICQ Skype   Вверх
Earnest
Дата 13.4.2007, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(knark @  13.4.2007,  16:48 Найти цитируемый пост)
Суть в том что мне как раз надо что бы запрос выполянлся на ней, а на моем компе, он должен умереть, что бы освободить тред, для нового запроса. 

А почему новый запрос нужно создавать в новом потоке? Почему существующий поток, выполнив один запрос, не может отправить следующий?
А TerminateThread именно так и работает: убивает поток, но не освобождает ничего. Это аварийное завершение, а в нормальном случае поток должен завершаться сам. Так уж тут заведено.
 Например, как-то так: заведи потоков, сколько надо (хочешь). Сгенерированный запросы сложи где-нибудь в кучку. Каждый поток берет из кучки очередной запрос, отправляет, ждет, берет следующий, и т.д.



--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0856 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.