Форум программистов, компьютерный форум CyberForum.ru

Приведение LPVOID к классу "непостоянной" величины - C++

Восстановить пароль Регистрация
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
24.08.2012, 14:37     Приведение LPVOID к классу "непостоянной" величины #1
В поток посылаю экземпляр класс :
C++
1
userThread = CreateThread(NULL, NULL, ConnectionShell, (LPVOID)(&userCurrent), NULL, NULL);
Где пытаюсь излвечь экземпляр :
C++
1
2
3
4
5
6
7
8
DWORD CALLBACK ConnectionShell(LPVOID lParam)
{
    USER* userCurrent = new USER;
    memcpy(userCurrent, lParam, 44); // 44 - размер экземпляра после вызова стандартного\ конструктора
    userCurrent->Connection(); // Здесь так же побывали (USER*)(lParam)->Connection(); и их братья\
reinterpret/static/dynamic_cast
    return FALSE;
}
Сам класс "непостоянной" величины, ибо в нём есть vector :
C++
1
2
3
4
5
6
7
8
class USER
{
private :
    sockaddr_in _taddress;
    SOCKET _tsocket;
    std::vector <BOOL> _trooms;
...
};
Вопрос : как привести ОБРАТНО к типу USER тип LPVOID? Ведь если этого сделать нельзя, то вектор придется выносить отдельно. Прощай абстракция :<
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2012, 14:37     Приведение LPVOID к классу "непостоянной" величины
Посмотрите здесь:

C++ Явное приведение "void*"
как сделать чтобы дружественная функция классу принимал ааргумент типа "класс" который при создании ничем не инициализирован? C++
C++ Получение доступа к классу "свыше".
C++ Необработанное исключение в "0x00412b4a" в "kursovik.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000004".
Необработанное исключение в "0x00414558" в "467.exe": 0xC0000005: Нарушение прав доступа при чтении "0xabababbb" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andsteadur
152 / 136 / 3
Регистрация: 23.05.2009
Сообщений: 275
24.08.2012, 14:38     Приведение LPVOID к классу "непостоянной" величины #2
C++
1
2
3
4
5
6
DWORD CALLBACK ConnectionShell(LPVOID lParam)
{
    USER* userCurrent = reinterpret_cast<USER*>(lParam);
    userCurrent->Connection();
    return FALSE;
}
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
24.08.2012, 14:54  [ТС]     Приведение LPVOID к классу "непостоянной" величины #3
Andsteadur, зря комментарии к коду не прочитали. Я писал, что пробовал это.
Так же пробовал virtual void Connection();
Andsteadur
152 / 136 / 3
Регистрация: 23.05.2009
Сообщений: 275
24.08.2012, 15:11     Приведение LPVOID к классу "непостоянной" величины #4
Не знаю, не знаю... У меня в поток все данные корректно передаются в MSVS 2008.
Вот eще пример, правда здесь без потока: http://liveworkspace.org/code/71ba1e...316d7bb08a9c09
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
24.08.2012, 15:19  [ТС]     Приведение LPVOID к классу "непостоянной" величины #5
Вопрос решен.
Проблема была в потоке. Пока выполнялся поток, куда посылался объект класса USER, функция, где был создан поток и этот объект, благополучно выпиливались и завершались, вот и уничтожался объект типа USER, передаваемый в поток через LPVOID.
Проблему можно решить введением глобальной или static переменной в функцию.
Andsteadur
152 / 136 / 3
Регистрация: 23.05.2009
Сообщений: 275
24.08.2012, 15:25     Приведение LPVOID к классу "непостоянной" величины #6
Либо динамически создавать объект, а удалять его перед завершением потока, если он больше не нужен:
C++
1
2
USER *userCurrent = new USER(...);
userThread = CreateThread(NULL, NULL, ConnectionShell, reinterpret_cast<LPVOID>(userCurrent), NULL, NULL);
Yandex
Объявления
24.08.2012, 15:25     Приведение LPVOID к классу "непостоянной" величины
Ответ Создать тему
Опции темы

Текущее время: 01:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru