|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
Статический метод как точка входа в поток - как избавиться07.01.2014, 23:21. Показов 3710. Ответов 19
Метки нет (Все метки)
Привет всем.Вопрос такой: использую потоки в своей программе,они создаются и уничтожаются в классе, и в классе так же находится метод,который является точкой входа потока.Суть в том,что если эта точка входа находится в классе,то ее нужно обьявлять как static,что мне не подходит,так как все объекты,находящиеся в этом методе нужно тоже делать статическими,а их довольно много.Собственно вот и нарисовывается сам вопрос - как избавиться от этой "статичности"?)Искал в гугле,не понял ничего)можете подробнее объяснить как это сделать?
Использую winapi для работы с потоками
0
|
|
| 07.01.2014, 23:21 | |
|
Ответы с готовыми решениями:
19
Как объявить статический метод класса?
Как передать нестатическое поле в статический метод класса? |
|
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
|
|
| 08.01.2014, 00:02 | |
|
Что мешает использовать в качестве точки входа специально обученную функцию, вызывающую какие угодно методы?
0
|
|
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
| 08.01.2014, 00:06 | |
|
в новом стандарте такой проблемы нет.
но если он по какой-то причине не доступен, то: в татическую фунцию передаете this. статическая функция обычно void* принимает. она кастит этот void* к типу самого класса и вот в статической фунции у вас есть указатель на инстанс класса. вызываете у него какие хотите методы, ведь статической функции доступны все методы\мемберы через этот указатель.
0
|
|
|
13 / 13 / 5
Регистрация: 29.06.2011
Сообщений: 85
|
|
| 08.01.2014, 00:10 | |
|
Создаёте статическую функцию, которая будет являтся дружественной для нужного класса(ThreadProc).
Затем создаёте простую функцию (член) класса, которая должна выполнять необходимые действия. В CreateThread передаёте указатель на статическую функцию, а в качестве lpParametr передаёте указатель на класс, в котором находится нужная функция член. Затем в ThreadProc пишите: return ((ВАШ_КЛАСС*)lpParametr->ФУНКЦИЯ_ЧЛЕН());
0
|
|
|
|
||||||
| 08.01.2014, 00:10 | ||||||
|
Может воспользоваться тем что предлагает C++11:
0
|
||||||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 08.01.2014, 14:19 [ТС] | |
|
А как именно передать this через передаваемый указатель в статическом методе?можете привести пример?
С стандартной библиотекой <thread> знаком,но мне нужно именно winapi
0
|
|
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
| 08.01.2014, 14:33 | |
|
свой винапишный код покажите. с ним проще будет объяснить.
0
|
|
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 09.01.2014, 00:13 [ТС] | |
|
Я пишу вам с мобильного телефона,интернета на компьютере нет,поэтому сложно будет написать вам код,потому что он достаточно весомый...
Короче у меня есть есть два класса _figure и _area.В классе _figure имеется метод,который мне нужно выполнять в новом потоке - DWORD WINAPI MoveDown(PVOID).В классе _area есть метод void Start() в котором имеется указатель на класс _figure.И как раз в методе Stast() мне нужно заводить как раз второй поток с точкой входа MoveDown(...).Поток завожу функцией CreateThread(...) ,куда передаю собственно функцию MoveDown(...) и указатель на класс _figure.Суть в том,что мне нужно делать эту точку входа статической,и следовательно все методы и поля,которые там используются(в частности они все являются данными класса _figure) нужно делать тоже статическими,что меня категорически не устраивает... Вот собственно рассказал на словах Вам мой код...Помогите пожалуйста
0
|
|
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||||||
| 09.01.2014, 00:20 | ||||||
|
вот так я надеюсь будет понятно:
этот void* кастится к Figure* и тут же вызывается его метод. в результате метод будет вызван в отдельном потоке для отдельного инстанса. никаких статических полей не надо.
0
|
||||||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 09.01.2014, 23:08 [ТС] | |
|
Во!всё заработало!спасибо большое...теперь всё понятно)
0
|
|
|
║XLR8║
|
|
| 09.01.2014, 23:20 | |
|
Bretbas, я не читал все посты. Но мне кажется паттерн одиночка (singletone) подходит как никто другой.
Добавлено через 2 минуты http://en.wikipedia.org/wiki/Singleton_pattern
0
|
|
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 10.01.2014, 23:59 [ТС] | |
|
Слушайте,а не поможете сделать обертку в виде класса для создания потока?Чтобы в конструктор я передавал название функции,которая будет использована как точка входа в поток,потом название класса где выполняется поток и сам объект на параметры?И чтобы статический метод этот был внутри класса,и меня не затрагивал
0
|
|
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 12.01.2014, 00:57 [ТС] | |
|
Ммм?
0
|
|
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
| 12.01.2014, 01:04 | |
|
если нет возможности использовать новый стандарт, то все равно лучше воспользоваться чем-то готовым.
boost, tbb, ... если писать универсальную вещь, то код будет досаточно хитрый, с кучей шаблонов и все равно скорее всего криво получится.
1
|
|
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
||||||
| 13.01.2014, 02:50 [ТС] | ||||||
|
Да я хотел тупо обертку сделать,чтобы был класс,для создание потока, и чтобы. для каждого потока имелся свой экземпляр класса,куда через конструктор передается функция-метод,котороя потом вызывается в статическом методе этого класса.Вот типо такого что-то))
А еще...как мне передать формальный параметр в функцию,которая является точкой входа в поток?
0
|
||||||
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||||||
| 13.01.2014, 23:04 | ||||||
1
|
||||||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 14.01.2014, 01:10 [ТС] | |
|
Готового решения вы имеете ввиду библиотеку типа <thread>?
0
|
|
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
| 14.01.2014, 11:15 | |
|
да.
0
|
|
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 19.01.2014, 01:22 [ТС] | |
|
Я отказался то этой библиотеки по той причине,потому что там нет таких функций как приостановить поток и возобновить его(ResumeThread(...) к примеру) как на винапи))
Если вы опровергнете мой слова,или подскажете какое-нибудь подобие этих функций,то я буду очень благодарен и у меня будут мысли о том,чтобы вернуться к этой библиотеки))
0
|
|
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|||||||||||
| 19.01.2014, 12:48 | |||||||||||
|
похоже что новый стандарт вам доступен и вы сможете вот такой пример скомпилять:
на счет станартной библиотеки: у std::thread есть такие методы: std::thread::get_id - returns the id of the thread std::thread::native_handle - returns the underlying implementation-defined thread handle я сам не пробовал, но похоже на то, что то, что они возвращают можно использовать в винапишных функциях после соответствующего каста. Т.е. можно зарезьюмить и засаспендить интересующий поток.
0
|
|||||||||||
| 19.01.2014, 12:48 | |
|
Помогаю со студенческими работами здесь
20
Программа не содержит статический метод "Main", подходящий для точки входа
Единая точка входа, как в htaccess Как вызвать статический метод в обработчике событий? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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(), которая. . .
|