Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
1

Передача в функцию-обработчик потока объекта класса

25.05.2015, 19:23. Просмотров 466. Ответов 8
Метки нет (Все метки)

Чтобы написать обработчик для потока, нужно написать функцию с такой сигнатурой: DWORD func(void* param). У меня есть объект класса, который я хочу передать в обработчик. Вопрос: это как-то возможно? Вообще мне нужно передать массив double в функцию, но учитывая, что размер (а он должен быть не константным) передать вторым параметром никак не получится, решил написать класс "Массив", в котором размер будет сохраняться. Но потом возникла ошибка, когда объекту класса внутри функции нельзя присвоить указатель на void, передающийся через параметр. Ну вот код для пояснения:

C++
1
2
3
4
5
DWORD func(void* param)
{
   Array* temp = dynamic_cast<Array*>(param);    // ???
   Array temp = (Array*) param;                // в обоих случаях VS 2013 пишет, что param должен указывать на полный тип
}
По правде, виды преобразований вызывают у меня трудности, так что если dynamic_cast не уместен, не обессудьте .
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2015, 19:23
Ответы с готовыми решениями:

Передача собственных переменных в обработчик событий
Доброго времени суток! Буквально недавно я начал понемножку разбираться в...

Обработчик событий внутри класса создания окна
Хочу сделать класс для создания окна (в проекте хочу использовать несколько...

Создание потока из класса
Решил создать проект для работы с COM с помощью класса, на основе проекта,...

Передача метода в поток после инициализации потока
Разработать класс ThreadPool. Объект этого класса содержит несколько потоков,...

Передача дополнительных параметров в обработчик WndProc через свой класс функциями Get/SetWindowLong
Все доброго здоровья. Задумываю для себя небольшое удобство в виде...

8
jonson
234 / 207 / 84
Регистрация: 18.03.2010
Сообщений: 750
25.05.2015, 19:48 2
C++
1
Array * temp = reinterpret_cast<Array*>(param);
1
castaway
Эксперт С++
4932 / 3038 / 454
Регистрация: 10.11.2010
Сообщений: 11,117
Записей в блоге: 10
Завершенные тесты: 1
25.05.2015, 19:49 3
Преобразуй просто через reinterpret_cast.
C++
1
Array * p = reinterpret_cast<Array *>( param );
Как передаёшь массив в обработчик, и как он при этом объявлен?
1
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
25.05.2015, 20:01  [ТС] 4
castaway, черт, а ведь хотел через него привести тип. Вообще там массив таких объектов, в объекте есть поле double* array, он и есть массив чисел, с ним все работается. В CreateThread передаю так: &objs[i] (я перебираю в цикле массив объектов).

Так, с этим спасибо. А можно ли как-то получить сам объект, не указатель? Я имею в виду чтобы было возможно вот это:
C++
1
 Array temp = *param;   // как-то можно привести param?
И как можно было бы обойтись без нового типа, т.е. передать массив, но динамический?
0
castaway
Эксперт С++
4932 / 3038 / 454
Регистрация: 10.11.2010
Сообщений: 11,117
Записей в блоге: 10
Завершенные тесты: 1
25.05.2015, 20:15 5
Цитата Сообщение от tnk500 Посмотреть сообщение
А можно ли как-то получить сам объект, не указатель?
Можно, но для этого придётся писать оператор присваивания в классе Array, а это лишняя память и лишнее копирование. Тебе оно зачем? Чем указатель не устраивает?

Цитата Сообщение от tnk500 Посмотреть сообщение
И как можно было бы обойтись без нового типа, т.е. передать массив, но динамический?
Про это не понял.
0
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
25.05.2015, 20:17  [ТС] 6
castaway, так, просто интересно. А что насчет динамического массива? Можно через глобальную переменную сделать, но есть другие пути?
0
castaway
Эксперт С++
4932 / 3038 / 454
Регистрация: 10.11.2010
Сообщений: 11,117
Записей в блоге: 10
Завершенные тесты: 1
25.05.2015, 20:22 7
Цитата Сообщение от castaway Посмотреть сообщение
оператор присваивания
Поправка: конструктор копирования.

Цитата Сообщение от tnk500 Посмотреть сообщение
castaway, так, просто интересно. А что насчет динамического массива? Можно через глобальную переменную сделать, но есть другие пути?
Я не понимаю что ты имеешь в виду. Можешь показать в виде неправильного кода?
0
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
25.05.2015, 20:32  [ТС] 8
castaway, я имею в виду передать в качестве параметра функции потока массив double чисел. Но размер задается пользователем (массив динамический), поэтому перебирать в цикле элементы массива при этом находясь в функции потока, нельзя, потому что размер передать вторым параметром в функцию потока невозможно (поэтому и пришлось писать класс). Это можно сделать с помощью глобальной переменной:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int n;
 
DWORD func(void* param)
{
   double* temp = reinterpret_cast<void*>(param);
   for(int i = 0; i < [B]n[/B]; ++i)
      ...
}
 
int main()
{
   std::cin >> n;
   double* array = new double[n];
   CreateThread(... , reinterpret_cast<void*>(array), ...);          
   ...
}
А можно ли обойтись без глобальных переменных?

Хотя мне кажется, это один из случаев, когда глобальная переменная скорее нужна, чем мешает.
0
castaway
Эксперт С++
4932 / 3038 / 454
Регистрация: 10.11.2010
Сообщений: 11,117
Записей в блоге: 10
Завершенные тесты: 1
25.05.2015, 20:53 9
Самый простой и на мой взгляд правильный способ это передать указатель на простую структуру, как ты и делал.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct myArray {
    double * data;
    size_t size;
};
 
DWORD func( void * param )
{
    myArray * temp = reinterpret_cast<myArray *>( param );
    for ( int i = 0; i < temp->size; ++i ) {
        ...
        ... temp->data[i] ...
        ...
    }
}
 
int main()
{
    myArray arr;
    std::cin >> arr.size;
    arr.data = new double[arr.size];
    CreateThread(... , reinterpret_cast<void*>( &arr ), ...);          
    ...
}
0
25.05.2015, 20:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2015, 20:53

Регистрация класса окна потока
Подскажите пожалуйста, почему при регистрации класса окна потока функция BOOL...

Клонирование объекта шаблонного класса
Задача ниже представленного механизма - запоминать функции/методы со всеми...

Создание объекта класса в другом классе!!!
//----------------------------------Address.h-----------------------------------...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru