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

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

25.06.2019, 13:47. Показов 4266. Ответов 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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
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,030
Записей в блоге: 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,030
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru