0 / 0 / 0
Регистрация: 24.08.2012
Сообщений: 11
|
|
1 | |
Освобождение памяти24.08.2012, 19:17. Показов 3217. Ответов 20
Метки нет (Все метки)
Есть многопоточное приложение.
Создается глобальная структура: Пример из msdn. Код
typedef struct _MyData { int val1; TStringList* strlist; } MYDATA, *PMYDATA; В функции, где собственно создаем сам поток, выделяем память, а указатель из структуры и будет указателем на эту выделяемую память. Переменная типа структуры: Код
PMYDATA pData; Код
pData = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MYDATA)); Код
pData->strlist = new TStringList; pData->strlist->Text = Memo1->Text; //просто присваиваем данные Использовать WaitForMultipleObject не хочу. Если в потоке вызвать HeapFree(GetProcessHeap(), 0, pData); Память освободим? Как правильнее освободить память?
0
|
24.08.2012, 19:17 | |
Ответы с готовыми решениями:
20
Резервирование памяти/освобождение памяти для трехмерного массива Освобождение памяти в C++ Освобождение памяти Освобождение памяти |
0 / 0 / 0
Регистрация: 24.08.2012
Сообщений: 11
|
||||||
25.08.2012, 18:32 [ТС] | 3 | |||||
Тогда в самом потоке следует вызывать HeapFree и деструктор?
Первым следует вызвать дуструктор?
0
|
0 / 0 / 0
Регистрация: 24.08.2012
Сообщений: 11
|
|||||||||||
27.08.2012, 17:50 [ТС] | 5 | ||||||||||
Отличие в том, что HeapFree вызывается в потоке. Может можно обойтись без кучи вовсе, а всю память выделять через new?
0
|
0 / 0 / 0
Регистрация: 24.08.2012
Сообщений: 11
|
|
27.08.2012, 19:25 [ТС] | 7 |
А c HeapFree() и ~MyData(); в самом потоке будет нормально?
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
27.08.2012, 19:28 | 8 |
0
|
0 / 0 / 0
Регистрация: 24.08.2012
Сообщений: 11
|
|
27.08.2012, 20:08 [ТС] | 10 |
Как тогда лучше поступить?
Освобождать память нужно. Может по-другому выделять? Если делать выше описанным способом, то как правильнее освободить кучу и память через new. Если можно, с кодом.
0
|
0 / 0 / 0
Регистрация: 24.08.2012
Сообщений: 11
|
|
27.08.2012, 20:33 [ТС] | 12 |
Через val1,val2 в поток передаются внешние данные (загружаемые с файла или которые берутся с формы). С ними провожу вычисления. Полученные данные сохраняются в файл. Поток завершается и нужно освободить память из потока.
0
|
0 / 0 / 0
Регистрация: 24.08.2012
Сообщений: 11
|
|
27.08.2012, 20:41 [ТС] | 14 |
Каждый поток пишет в отдельный файл.
0
|
27.08.2012, 22:36 | 15 |
Тогда проще...
Щас может накатаю пример. Добавлено через 1 час 51 минуту Что то я туго соображаю... А как без него ? Т.е. вы хотите завершить основной поток раньше вторичных и убив формы ?
1
|
0 / 0 / 0
Регистрация: 24.08.2012
Сообщений: 11
|
|
27.08.2012, 23:17 [ТС] | 16 |
Нет.
Еще один вопрос на счет потоков. Использую Rad studio 2010. Создание потоков организовано через CreateThread(...); Вывод информации на главную форму через критическии секции. Слышал на счет проблемы "EInvalidOperation: Canvas does not aloow drawing". При использовании крит. секций в билдере такие ошибки возможны? Что лучше использовать: крит. секции или Synchronize()?
0
|
27.08.2012, 23:22 | 17 |
Synchronize() - это метод класса TThread, и к CreateThread(...) неимеет никакого отношения;
0
|
0 / 0 / 0
Регистрация: 24.08.2012
Сообщений: 11
|
|
27.08.2012, 23:31 [ТС] | 18 |
Сама канва в коде вообще не присутствует.
При прогоне большого количества потоков, иногда появляется такая ошибка в окне отладчика. Если использовать WaitForMultipleObject, как его использовать так, чтоб не повесить форму? В цикле с небольшим delay?
0
|
27.08.2012, 23:36 | 19 |
Ну если у тебя приложение с формами тогда тебе не нужен WaitForMultipleObject().
И если нужно что-то выводить из потоков в компоненты на форме то лучше использовать класс TThread вместо WinApi - потока Тебе нужно знать когда потоки завершаться ?
0
|
0 / 0 / 0
Регистрация: 24.08.2012
Сообщений: 11
|
|
27.08.2012, 23:57 [ТС] | 20 |
Да. Подскажешь?
Событие OnTerminate? File | New | Other | Thread Object подключаем, создаем указатель и работаем. Bесь код потока засовываем в TThread::Execute(). Вывод на форму через Synchronize(func);, где func - ф-ция в которой код работы с формой. Ведь так?
0
|
27.08.2012, 23:57 | |
27.08.2012, 23:57 | |
Помогаю со студенческими работами здесь
20
Освобождение памяти Освобождение памяти освобождение памяти Освобождение памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |