Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

CreateThread: возможно ли запустить не статический метод класса?

25.06.2019, 13:47. Показов 4248. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возможно ли в CreateThread запустить не static процедуру класса?
C++
1
2
clas_s obj;
HANDLE h = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&obj.FUNCTION, 0, 0, 0);
как-то так
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.06.2019, 13:47
Ответы с готовыми решениями:

Вызов метода из другого класса, при этом нельзя создать объект второго класса и метод не статический
У меня есть 2 класса - один с формой и кнопкой на ней и другой класс, у которого есть метод void Method() Необходимо при нажатии на...

Статический элемент и метод класса
Доброго времени суток, разбираюсь со статическим элементом и методом класса. накидал небольшую програмку, но Visual Studio 2010 ее не...

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

30
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.06.2019, 13:56
Цитата Сообщение от ReYalp Посмотреть сообщение
не static процедуру класса?
нет
1
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
25.06.2019, 15:22
Лучший ответ Сообщение было отмечено ReYalp как решение

Решение

Цитата Сообщение от ReYalp Посмотреть сообщение
Возможно ли в CreateThread запустить не static процедуру класса?
Можно через proxy
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class class_s
{
public:
    static DWORD __stdcall static_proxy(LPVOID lpThreadParameter)
    {
        return static_cast<class_s*>(lpThreadParameter)->thread_function(); 
    }  
private:
    DWORD thread_function()
    {
        // функция потока
        return 0;
    }
};
 
////.................
 
class_s obj;
HANDLE h = CreateThread(0, 0, &class_s::static_proxy, &obj, 0, 0);
Естественно, obj должен жить столько же времени, сколько работает поток. Т.е. сначала поток должен быть присоединен к основному, и только потом должен вызываться деструктор obj. Программист должен это обеспечить для корректной работы любым из доступных способов.

Цитата Сообщение от ReYalp Посмотреть сообщение
(LPTHREAD_START_ROUTINE)&obj.FUNCTION
Вы в любом случае неправильно передаете адрес функции.
Во-вторых никаких кастов здесь делать нельзя. Сигнатура функции должна полностью соответствовать.
C++
1
CreateThread(0, 0, &class_s::FUNCTION, 0, 0, 0);
2
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
25.06.2019, 15:49  [ТС]
DrOffset, а как передать в функциюе еще один параметр через этот прокси?
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
25.06.2019, 15:52
Цитата Сообщение от ReYalp Посмотреть сообщение
а как передать в функциюе еще один параметр через этот прокси?
Как поле класса.
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
25.06.2019, 15:59  [ТС]
DrOffset, а зачем использовать static_cast ? Нельзя разве сразу как параметр вместо LPVOID указать clas_s*?
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
25.06.2019, 16:02
Цитата Сообщение от ReYalp Посмотреть сообщение
Нельзя разве сразу как параметр вместо LPVOID указать clas_s*?
Нет.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
25.06.2019, 16:06  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Нет.
А Почему нет?
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
25.06.2019, 16:10
Цитата Сообщение от ReYalp Посмотреть сообщение
А Почему нет?
Потому что мы хотим писать корректные программы, без UB, Правда ведь?
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
25.06.2019, 16:13  [ТС]
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
без UB
что такое UB?
Цитата Сообщение от DrOffset Посмотреть сообщение
Правда ведь?
Да,но что такого если я напишу как я описал выше? Если это не корректно то почему?
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
25.06.2019, 16:20
Цитата Сообщение от ReYalp Посмотреть сообщение
что такое UB?
Неопределенное поведение.

Потому что void * p в общем случае не обязан быть такого же размера, что и class_s * ps. Стандарт только гарантирует, что ps всегда поместится в p, и что если мы положили ps в p, то всегда сможем достать ps из p используя стандартные преобразования.
У вас же предполагается функция которая принимает void *, внутри CreateThread будет передавать данные в эту функцию так, как будто бы она принимает void *, а на самом деле вы передали туда функцию, которая принимает class_s *. Естественно потому, что размеры void * и class_s * под windows одинаковы, ваш код заработает, но от этого он не перестанет быть некорректным и не перестанет содержать UB.

Цитата Сообщение от ReYalp Посмотреть сообщение
Да,но что такого если я напишу как я описал выше?
Вы у себя можете любую дичь творить, но на форуме я буду советовать как правильно. Дальше ваше дело уже, слушать меня или нет.
2
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
25.06.2019, 16:28  [ТС]
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
Вы у себя можете любую дичь творить, но на форуме я буду советовать как правильно. Дальше ваше дело уже, слушать меня или нет.
Я не имел ввиду ничего такого,я Вас слушаю,Вы даете очень ползеные советы,мне просто интересно знать почему так,а не иначе,а не просто делать так потому что так лучше
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
25.06.2019, 16:36
ReYalp, Если вы беспокоитесь о производительности, то этот правильный вариант будет ничуть не медленнее неправильного. Поэтому единственное слабое оправдание для его использования остается разве что "меньше писать". Однако помимо явного UB, появляется еще и скрытая мина, в виде мощного каста, который понадобится, чтобы привести типы функций. После этого каста компилятор уже не предупретит вас, если вы случайно добавите еще параметр в эту функцию или поменяете его тип, и вот тут уже можно получить вполне реальные, а не теоретические проблемы.

Добавлено через 4 минуты
ReYalp, Вообще не понятно, зачем вам мучиться с CreateThread, когда в современном С++ есть std::thread.
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
25.06.2019, 16:47  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Т.е. сначала поток должен быть присоединен к основному, и только потом должен вызываться деструктор obj.
Каким образом можно закрыть поток если он заблокирован?(К примеру ждет recv)

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Вообще не понятно, зачем вам мучиться с CreateThread, когда в современном С++ есть std::thread.
мне интересно как работает CreateThread и все,хочу с ним разобраться
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
25.06.2019, 16:48
Цитата Сообщение от ReYalp Посмотреть сообщение
К примеру ждет recv
Закрыть сокет в другом потоке, тогда recv завершится с ошибкой.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
25.06.2019, 16:59  [ТС]
Croessmah, а что в случае если пользователь нажал на "крестик" ,что тогда происходит? Никакие деструкторы не запускаются ведь? Как тогда поток закрывать?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
25.06.2019, 17:00
Цитата Сообщение от ReYalp Посмотреть сообщение
Каким образом можно закрыть поток если он заблокирован?(К примеру ждет recv)
Не надо его, поток, блокировать надолго, тем более навсегда
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
25.06.2019, 17:03
Цитата Сообщение от ReYalp Посмотреть сообщение
а что в случае если пользователь нажал на "крестик" ,что тогда происходит?
Обрабатываем закрытие, закрываем сокет. Но это не поможет, если пользователь принудительно прибивает Ваш процесс.
К слову, у меня было реализовано чуть иначе - сокет с таймаутом и recv в цикле.
Если нужно было остановить чтение, то просто выставляется флаг в другом потоке и цикл перестает запускать recv.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
25.06.2019, 17:06  [ТС]
oleg-m1973, окей,но что если я укажу время ожидания к примеру 5 секунд и на протяжении этого времени нажму на "крестик"

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Но это не поможет, если пользователь принудительно прибивает Ваш процесс.
а что делать в этом случае?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
25.06.2019, 17:06
Цитата Сообщение от ReYalp Посмотреть сообщение
oleg-m1973, окей,но что если я укажу время ожидания к примеру 5 секунд и на протяжении этого времени нажму на "крестик"
Ждёшь пока поток завершится, WaitForSingleObject
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.06.2019, 17:06
Помогаю со студенческими работами здесь

Как объявить статический метод класса?
выдает ошибку на 11 16 19 строку((((((( #include &lt;iostream&gt; using namespace std; class Sop { private: short int kol; ...

По какому объекту синхронизируется статический метод класса?
Если мы синхронизируем не статический метод, то он синхронизируется по &quot;своему&quot; объекту. А если мы синхронизируем статический метод,...

Как передать нестатическое поле в статический метод класса?
есть статическая фукция static LRESULT CALLBACK WndProc ( HWND,UINT,WPARAM,LPARAM); в ней нужно использоавть поля класса, вопрос -...

Как сделать методы к полям класса и перезапущенную операцию (статический метод)?
В Java я очень чайник, подскажите пожалуйста. Как это сделать? Определите класс &quot;точка&quot;, состоящий: - из полей: x, y...

Как рефлексией динамически получить статический метод для класса Convert
Как динамически получить метод для нестатического класса, я уже нашел. Делается что-то типа этого: ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru