|
Модераторы: Daevaorn |
|
Allest |
|
|||
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 17.9.2003 Где: Санкт-Петербург Репутация: нет Всего: нет |
Мне нужно чтобы поток выделял память, сохранял в vector, а потом завершался, и при этом к vector имеют доступ основной поток, поэтому ещё и синхронизация нужна.
Вроде всё делаю правильно, но почему-то происходит ошибка доступа к памяти (как я понял): Unhandled exception in Test.exe: 0xC0000005: Access Violation. Вот мой код с ошибкой, можно сразу создать новое win32 application, и запустить. Здесь 10 потоков CAfcTest выделяют память и сохраняют в vector, а в деструкторе память освобождается. В общем, помогите плиз найти ошибку или другое решение
|
|||
|
||||
Олег М |
|
|||
Опытный Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
У тебя функция WorkProc() выполняется хрен знает сколько раз. Ошибка происходит, когда на миллион-какой-то итерации происходит переполнение памяти. А ты чего ожидал? Память-то не резиновая. |
|||
|
||||
Allest |
|
||||
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 17.9.2003 Где: Санкт-Петербург Репутация: нет Всего: нет |
В смысле в фунции много памяти выделяется из-за этого
А если сразу освобождать, то всё равно ошибка, т.е. если передалать так
|
||||
|
|||||
Олег М |
|
||||
Опытный Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
В смысле да. Ты нафига постоянно-то это вызываешь? Если не можешь понять что ты делаешь - вот полный аналог твоей программы
Посмотри как это будет работать. Тебе вообще, что надо сделать? Расскажи задачу поподробнее. |
||||
|
|||||
Allest |
|
|||
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 17.9.2003 Где: Санкт-Петербург Репутация: нет Всего: нет |
Спасибо за желание помочь. Думаю я понял почему появлялась ошибка: я вызывал 10 thread и каждый асихронно вызывал new и delete, из-за этого иногда 2 потока захватывали один и тот же блок памяти, а потом один из них освобождает эту память, а у другого остаётся указатель в "никуда" и при его вызове delete возникает та самая ошибка.
Или я ошибаюсь? Ведь нединамические переменные тоже память берут, но с ними проблем не было в отличае от созданных с помощью new.
А задача была у меня создать файловую панель типа как в TotalCommander, но проще: список файлов в ListView, и icons, ассоциируемые с файлами должны были загружаться в thread. Для этого после построения списка файлов запускал thread, который извлекал icons и добавлял HICON в vector и постил сообщение окну списка, чтобы тот прикрутил себе извлечённые icons. Как это сделать? |
|||
|
||||
Олег М |
|
||||||||||
Опытный Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Думаю, ты нифига не понял. Потоки у тебя синхронизируются совершенно нормально - нафига, иначе, критические секции существуют. А ошибка у тебя вылезает именно из-за переполнения памяти - покажи, где ты это контролируешь, если не согласен. Я поставил вот так и посмотрел сколько раз у тебя вызывается new
получилось дохрена. И исключение срабатывает, похоже в m_vec.push_back(pData) - массивы тожке не резиновые. А вообще зачем ты хранишь указатели на DWORD? Храни тогда уж просто значение std::vector<DWORD> m_vec.
Во первых потоки делай с приоритетом ниже нормального - иначе они нет смысла - они забьют основной поток. В вторых так и делай - загружай иконки в массив, синхронизируй с помощью критических секций, и чер определённое время, например на каждые 10 иконок посылай сообщени - SendMessage. В функции потока контролируй какую-нибудь булевскую переменную - завершение потока. Типа того
ev - событие с ручным сбросом - чтобы поток останавливался, когда ничего загружать не надо. Когда завершаешь поток делай
TerminateThread делать не надо |
||||||||||
|
|||||||||||
Allest |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 17.9.2003 Где: Санкт-Петербург Репутация: нет Всего: нет |
Не из-за переполнения памяти, повторяю
Всё правильно, но для того чтобы синхронизировать доступы к общей памяти нужно чтобы все потоки имели одну крит.секцию, а моём певоначальном коде у каждого потока была своя крит.секция.
Кстати, а как его перехватить? А за советы спасибо. |
||||||||
|
|||||||||
Олег М |
|
||||||
Опытный Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Точно, а я и не обратил внимания. Переделал уже?
Из МСДН:
|
||||||
|
|||||||
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |