Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Bretbas
Каждому свое
518 / 204 / 51
Регистрация: 05.08.2013
Сообщений: 1,600
Завершенные тесты: 2
#1

Статический метод как точка входа в поток - как избавиться - C++

07.01.2014, 23:21. Просмотров 1040. Ответов 19
Метки нет (Все метки)

Привет всем.Вопрос такой: использую потоки в своей программе,они создаются и уничтожаются в классе, и в классе так же находится метод,который является точкой входа потока.Суть в том,что если эта точка входа находится в классе,то ее нужно обьявлять как static,что мне не подходит,так как все объекты,находящиеся в этом методе нужно тоже делать статическими,а их довольно много.Собственно вот и нарисовывается сам вопрос - как избавиться от этой "статичности"?)Искал в гугле,не понял ничего)можете подробнее объяснить как это сделать?
Использую winapi для работы с потоками
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2014, 23:21
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Статический метод как точка входа в поток - как избавиться (C++):

Как правильно объявить статический метод - C++
например class A { private: static void method(); // объявление }; // как правильно объявить реализацию?

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

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

Нужно создать статический массив строк как статический массив указателей на строки. Условние ниже --> - C++
Слова английского текста рассортировать по возрастанию количества заданной буквы в слове. Слова с одинаковым количеством такой буквы...

создать статический массив строк как статический массив указателей на строки, задание ниже --> - C++
Слова английского текста, начинающиеся с гласных букв, рассортировать в алфавитном порядке по первой согласной букве слова. Остальные слова...

Статический поток fstream - C++
Нужно создать класс, в котором будет статическое поле класса fstream (для записи и чтения из файла). С помощью статического метода поток...

19
NoMasters
Псевдослучайный
1908 / 1119 / 77
Регистрация: 13.09.2011
Сообщений: 3,175
08.01.2014, 00:02 #2
Что мешает использовать в качестве точки входа специально обученную функцию, вызывающую какие угодно методы?
0
DU
1485 / 1131 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2014, 00:06 #3
в новом стандарте такой проблемы нет.
но если он по какой-то причине не доступен, то:
в татическую фунцию передаете this. статическая функция обычно void* принимает.
она кастит этот void* к типу самого класса и вот в статической фунции у вас
есть указатель на инстанс класса. вызываете у него какие хотите методы, ведь
статической функции доступны все методы\мемберы через этот указатель.
0
Плутон
13 / 13 / 4
Регистрация: 29.06.2011
Сообщений: 85
08.01.2014, 00:10 #4
Создаёте статическую функцию, которая будет являтся дружественной для нужного класса(ThreadProc).
Затем создаёте простую функцию (член) класса, которая должна выполнять необходимые действия.
В CreateThread передаёте указатель на статическую функцию, а в качестве lpParametr передаёте указатель на класс, в котором находится нужная функция член.
Затем в ThreadProc пишите:
return ((ВАШ_КЛАСС*)lpParametr->ФУНКЦИЯ_ЧЛЕН());
0
DiffEreD
1441 / 778 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
08.01.2014, 00:10 #5
Может воспользоваться тем что предлагает C++11:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <thread>
 
class some_class
{
   mutable std::thread t;
   int val = 100;
public:
   void foo(int n) const
   {
      for (int i = 0; i < n; ++i)
         std::cout << "Hello from foo. val = " << val << "\n";
   }
 
   void create_thread() const
   {
      t = std::thread(&some_class::foo, this, 5);
      t.join();
   }
};
 
int main()
{
   some_class sm;
   sm.create_thread();
 
   return 0;
}
0
Bretbas
Каждому свое
518 / 204 / 51
Регистрация: 05.08.2013
Сообщений: 1,600
Завершенные тесты: 2
08.01.2014, 14:19  [ТС] #6
А как именно передать this через передаваемый указатель в статическом методе?можете привести пример?
С стандартной библиотекой <thread> знаком,но мне нужно именно winapi
0
DU
1485 / 1131 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2014, 14:33 #7
свой винапишный код покажите. с ним проще будет объяснить.
0
Bretbas
Каждому свое
518 / 204 / 51
Регистрация: 05.08.2013
Сообщений: 1,600
Завершенные тесты: 2
09.01.2014, 00:13  [ТС] #8
Я пишу вам с мобильного телефона,интернета на компьютере нет,поэтому сложно будет написать вам код,потому что он достаточно весомый...
Короче у меня есть есть два класса _figure и _area.В классе _figure имеется метод,который мне нужно выполнять в новом потоке - DWORD WINAPI MoveDown(PVOID).В классе _area есть метод void Start() в котором имеется указатель на класс _figure.И как раз в методе Stast() мне нужно заводить как раз второй поток с точкой входа MoveDown(...).Поток завожу функцией CreateThread(...) ,куда передаю собственно функцию MoveDown(...) и указатель на класс _figure.Суть в том,что мне нужно делать эту точку входа статической,и следовательно все методы и поля,которые там используются(в частности они все являются данными класса _figure) нужно делать тоже статическими,что меня категорически не устраивает...
Вот собственно рассказал на словах Вам мой код...Помогите пожалуйста
0
DU
1485 / 1131 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.01.2014, 00:20 #9
вот так я надеюсь будет понятно:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Figure
{
public:
  void MoveDown()
  {
    // ...
  }
 
  static void MoveDown(PVOID figure)
  {
    static_cast<Figure*>(figure)->MoveDown();
  }
};
т.е. по прежнему вызывается статический метод, но ему передается указатель на инстанс класса.
этот void* кастится к Figure* и тут же вызывается его метод. в результате метод будет вызван в
отдельном потоке для отдельного инстанса. никаких статических полей не надо.
0
Bretbas
Каждому свое
518 / 204 / 51
Регистрация: 05.08.2013
Сообщений: 1,600
Завершенные тесты: 2
09.01.2014, 23:08  [ТС] #10
Во!всё заработало!спасибо большое...теперь всё понятно)
0
outoftime
║XLR8║
756 / 656 / 88
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
09.01.2014, 23:20 #11
Bretbas, я не читал все посты. Но мне кажется паттерн одиночка (singletone) подходит как никто другой.

Добавлено через 2 минуты
http://en.wikipedia.org/wiki/Singleton_pattern
0
Bretbas
Каждому свое
518 / 204 / 51
Регистрация: 05.08.2013
Сообщений: 1,600
Завершенные тесты: 2
10.01.2014, 23:59  [ТС] #12
Слушайте,а не поможете сделать обертку в виде класса для создания потока?Чтобы в конструктор я передавал название функции,которая будет использована как точка входа в поток,потом название класса где выполняется поток и сам объект на параметры?И чтобы статический метод этот был внутри класса,и меня не затрагивал
0
Bretbas
Каждому свое
518 / 204 / 51
Регистрация: 05.08.2013
Сообщений: 1,600
Завершенные тесты: 2
12.01.2014, 00:57  [ТС] #13
Ммм?
0
DU
1485 / 1131 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.01.2014, 01:04 #14
если нет возможности использовать новый стандарт, то все равно лучше воспользоваться чем-то готовым.
boost, tbb, ...

если писать универсальную вещь, то код будет досаточно хитрый, с кучей шаблонов и все равно скорее всего криво получится.
1
Bretbas
Каждому свое
518 / 204 / 51
Регистрация: 05.08.2013
Сообщений: 1,600
Завершенные тесты: 2
13.01.2014, 02:50  [ТС] #15
Да я хотел тупо обертку сделать,чтобы был класс,для создание потока, и чтобы. для каждого потока имелся свой экземпляр класса,куда через конструктор передается функция-метод,котороя потом вызывается в статическом методе этого класса.Вот типо такого что-то))
А еще...как мне передать формальный параметр в функцию,которая является точкой входа в поток?
C++
1
2
3
4
5
6
7
8
...
class primer
public:
void funcmain(int i);
static DWORD WINAPI fun(PVOID object)
{
static_cast<primer*>object -> funcmain(что сюда передать и как);
...
Вот примерчик набросал...тяжело с мобилы объяснять:-)
0
13.01.2014, 02:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2014, 02:50
Привет! Вот еще темы с ответами:

Точка входа - C++
Подскажите пожалуйста как найти точку входа приложения?

Точка входа не найдена - C++
написал dll и создал приложение. Как проге показать эту самую точку входа?

Точка входа в dll в Linux - C++
Если в Windows точка входа в DLL является функция BOOL WINAPI DllMain(...), то какая функция является началом в системе Linux? И какие...

Где точка входа приложения? - C++
В общем, есть 3 файла. Разбирать их содержимое не нужно, меня интересует только конструкции include. Итак, файл main.cpp: #include...


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

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

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