Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 02.11.2015
Сообщений: 1

Утеря char* переменной при передаче объекта в дочерний поток

02.11.2015, 20:57. Показов 623. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, коротко опишу пред историю
есть объект общающийся с драйвером устройства,
есть форма связанная с объектом, служащая для изменения параметров или вывода ответа устройства,
все это предназначено для встраивания в виде dll в хост приложение,
все работает, и все бы хорошо, однако в драйвере устройства имеется функция (вызываемая в функции объекта по нажатию кнопки, допустим, "запуск" на форме) которая долго обрабатывается ( от 2 секунд до 1,5 минут в зависимости от параметров вызова) и конечно же блокируя интерфейс как нашей формы так и всего хост приложения, до конца своей обработки.
Идея пришедшая в лоб - создать отдельный поток в котором при нажатии кнопки запуск на форме, будет вызываться функция драйвера с текущими параметрами, которые передаются потоку. Результат функция драйвера записывает в файл, путь к которому требует на входе.

Реализовано примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class mythread : public TThread
{
private:
    MyObj* FObj
protected:
    void __fastcall Execute();
public:
    __fastcall mythread(bool CreateSuspended, MyObj* parent);
};
 
__fastcall mythread::mythread(bool CreateSuspended, MyObj* parent){
    FObj = parent;
}
 
void __fastcall mythread::Execute(){
    ... 
    drvCalcs(FObj->PathToFile);
    FObj->readFromFile(...);
    ...
}
C++
1
2
3
4
5
6
bool MyObj::MakeCalcs(){
    if (!OK) return false;
    PathToFile = CreateNewPath(); // char* PathToFile; - переменная класса 
    mythread tThr= new mythread(false,this);
    tThr->FreeOnTerminate=true;
}
На удивление объект передается в дочерний поток, однако почему то не полностью, переменная PathToFile оказывается пустой ("\0"), причем как в потоке, так и в родительском объекте, на шаге/после присваивания FObject = parent в дочернем потоке. int, bool и т.п. переменные объекта остаются нетронутыми, т.е. корректно отображаются как в родительском, так и в дочернем потоке.

Соответственно возник вопрос, в чем ошибка? и как ее исправить?
С потоками как то ранее не довелось работать, а первый блин стал в горле комом

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

Добавлено через 9 минут
Вообще как то не очень понятно, каким образом можно и нужно передавать данные между потоками, в гугле нашел лишь пример, похоже что из Архангельского, в котором это как то слабо отражено(
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.11.2015, 20:57
Ответы с готовыми решениями:

Утеря данных при передаче через TCP/IP ?!
Здравствуйте ! Может я криво искал, но не могу нигде найти ответ на свой вопрос, а самому - уже за 2-е недели сломал голову. :huh: ...

Ошибка сокета при передаче в поток
Короче лаба по програмиированию, типа сервер на TCP сокетах. Ошибка возникает внутри потока, куда я передаю созданные аксептом сокеты на...

Странное поведение при передаче структуры в поток
Добрый день! Долгое время пишу только на С# и Qt. Мозги совсем атрофировались от низкоуровневого кода. Но пришлось решать задачу с малыми...

1
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
02.11.2015, 23:05
Цитата Сообщение от Kirruu Посмотреть сообщение
// char* PathToFile; - переменная класса
Точнее сказать указатель...


а память для массива, адрес которого потом присваивается PathToFile где-нибудь выделяется? В конструкторе класса или в функции CreateNewPath()?

Добавлено через 3 минуты
Есть подозрение, что этому указателю присваивается адрес статического объекта, время жизни которого заканчивается раньше, чем это нужно для успешного выполнения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.11.2015, 23:05
Помогаю со студенческими работами здесь

template при передаче объекта
Зачем нужно template<typename type1> перед конструктором? Поему нельзя передать объект типа test1 по ссылке без templat'ов? ...

Ошибка при отладке ActiveX.DLL при передаче объекта форма
в вызывающем модуле Функция(Me) в ActiveX Sub Функция(frm as Object) typeof frm is form - выдает False в режиме отладки ActiveX...

Ошибка при передаче объекта SignalR Core
Приветствую. Передаю серверу SignalR Core объект класса со свойством ObservableCollection<T>, выходит следующая ошибка: ...

Nullreference Exception при передаче объекта в представление
Добрый день! Начинаю знакомство с ASP.NET Core При попытке отобразить свойства модели в представлении возникает вышеуказанное...

Не работает класс при передаче в функцию объекта
Всем привет, я не пойму подскажите куда правильно подставить #include "doodler.h" чтобы не было ошибок. Есть класс, который содержит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru