![]() |
|
|
![]()
|
|
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
||||
|
||||
| Нитонисе |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Переработал код, чтобы все вычисление шло в отдельном потоке, но что-то не работает.
В основной программе есть функция Calculate(), кторая выполняет расчет. Сначала она проверяет исходные данные и наполняет структуру с данными, необходимыми для расчета. Затем запускает отдельный поток, где сам расчет и происходит.
Вот так принципиально выглядит класс TMyThread
Проблема в том, что в поток структура S передается без данных. То есть вычислить res невозможно. Но как так? Ведь я же передал адрес нужной структуры данных из основного потока. |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Вам нужно скопировать к себе структуру при старте Thread'а, т.к. ваша оригинальная структура выходит из области видимости и разрушается сразу после запуска thread'а |
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Так ведь я в потоке работаю не с самой структурой, а с ее адресом. Этот адрес я и передаю при создании потока. Ведь эта операция корректна? |
|||
|
||||
| Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 14 Всего: 39 |
Ты вышел за пределы Calculate() и все твой объект TMyStruct S разрушен, а поток TMyThread(false,&S); запускается уже после выхода из Calculate() как ты думаешь какой адрес получит поток ???
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
||||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Значит TMyStruct должна быть глобальной переменной? Ну или хотябы членом класса формы. |
|||
|
||||
| DarkProg |
|
|||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: нет Всего: 19 |
Нет, ты в поток должен отдать значения из этой структуры, либо сделать указатель на структуру, выделить под указатель память, и потом передать этот указатель, только выделенную память потом надо будет как-то освободить(либо в деструкторе, либо в конце вычислений). -------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." |
|||
|
||||
| Нитонисе |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 917 Регистрация: 5.11.2009 Репутация: 2 Всего: 2 |
Ну я это и имел ввиду. Объявить глобальную переменную - указатель на структуру, в функции Calculate() выделить память для TMyStruct, заполнить структуру данными, передать указатель классу TMyThread и там использовать эти данные в вычислениях. А освободить память видимо надо в деструкторе TMyThread? Насколько это будет корректно при завершении работы потока штатно (то есть когда вычисления закончены) или внештатно (пользователь нажал кнопку "Отмена", прервав расчет)? |
|||
|
||||
| DarkProg |
|
|||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: нет Всего: 19 |
Да не нужна вам глобальная переменная! Указатель тем и хорош, что указатель вы отдадите потоку, и поток с ним сможет работать. И ничего ему не будет. В нынешнем варианте у вас объявляется переменная, которая "умирает" как только заканчивается выполнение процедуры, ну и собсно результат известен, а нужен указатель. Т.е. по сути сейчас компилятор выделяет память и освобождает её, и ему невдомёк, что адрес переданный в поток трогать нельзя. Используя указатель типа указатель на структуру вы уже сами начинаете управлять памятью, выделяя её, а переменная-указатель всего лишь является хранилищем для адреса и её разрушение после выхода из процедуры не будет иметь никакого значения для памяти которая выделена под структуру и значений которые там хранятся. И не путайте глобальную переменную и локальную переменную. Как реализуете, можно в деструкторе, можно в конце метода Execute, главное не забыть это сделать. Правильнее будет в деструкторе наверное в данном случае, особенно учитывая возможность прерывания вычислений. -------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Сделайте просто локальную копию. Вот так -
|
|||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 39 Всего: 64 |
Тогда нужно не забыть перегрузить оператор присваивания. А то всплывёт потом "что-нибудь"... -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
||||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |