Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как лучше поступить с отдельным потоком 
:(
    Опции темы
WiND
Дата 10.2.2010, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 3.12.2006

Репутация: нет
Всего: нет



Код

class CClient
{
public: void Create();
private: void Receiver(CClient *client);
}
...

DWORD WINAPI _receiver(LPVOID lpParam);

DWORD WINAPI _receiver(LPVOID lpParam)
{
CClient *cl = (CClient*)lpParam;
cl->Receiver(cl);
}

...

void CClient::Create()
{
CreateThread(...); //В качестве метода указываю _receiver(LPVOID lpParam) , он вызывает CClient::Receiver и тем самым удается достичь работы классового метода внутри другого потока
//в качестве параметра потоку я указываю ссылку на себя(класс).
}
void CClient::Receiver(CClient *client)
{
//какие-то действия
}


Все бы хорошо, но!
1. метод CClient::Receiver - скрыт, поэтому я его явно вызвать не могу из указателя.
2. помимо метода, на который (черт с ним), можно передать указатель на функцию (Receiver), мне необходимо иметь доступ к другим скрытым членам класса. 
Найденый мной выход - это создавать струтуру в которой указывать все необходимые ссылки и в CreateThread в качестве параметра передавать ссылку на эту структуру.

Вопрос: Можно как нибудь красиво подойти к решению данного вопроса? Может быть friend как-то здесь поможет?
PM MAIL   Вверх
WiND
Дата 10.2.2010, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 3.12.2006

Репутация: нет
Всего: нет



Так, пожалуй я тупанул... можно же обратиться внутри функции класса к самому классу. она же его часть )
Только как, в качестве параметра в CreateThread передать адрес функции CClient::Receiver(void)
Нужно преобразовать lPVOID lp = (LPVOID)&CClient::Receiver;
Код

Error    1    error C2440: 'type cast' : cannot convert from 'void (__thiscall CClient::* )(void)' to 'LPVOID'


PM MAIL   Вверх
bsa
Дата 10.2.2010, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Обычно, это делается через статические приватные методы классов:
Код
class CClient
{
public:
   void Create() {
        ...
        CreateThread(..., &CClient::_receiver, ...);
        ...
   }
private:
   static WINAPI _receiver(LPVOID data) { static_cast<CClient*>(data)->Receiver(); }
};


Добавлено через 43 секунды
Может лучше использовать boost::asio?  smile 
PM   Вверх
WiND
Дата 10.2.2010, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 3.12.2006

Репутация: нет
Всего: нет



А как в качестве параметра в CreateThread передать ссылку на CClient::Receiver()
а в _receiver(LPVOID data) просто вызвать ее? это позволит не делать Receiver публичным)
про boos:asio - когда нибудь... ))
Можно конечно сделать _receiver другом ) Но!
Слишком много времени убил на способ передачи ссылки на функцию член класса, чтобы просто забыть про это)

Это сообщение отредактировал(а) WiND - 10.2.2010, 13:31
PM MAIL   Вверх
WiND
Дата 10.2.2010, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 3.12.2006

Репутация: нет
Всего: нет



через пятое колено получилось таки.
Код

    typedef void (CClient::*MyRecv)(void);
    MyRecv *r = new MyRecv(&CClient::Receiver);
    CreateThread(NULL, 0, _receiver, 
        r
        , 0, &dwReceiverThreadId);

Вот как-то так. Интересно знать мнение умных), насколько хорошо так делать?

Это сообщение отредактировал(а) WiND - 10.2.2010, 13:46
PM MAIL   Вверх
Dem_max
Дата 10.2.2010, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Скинь полный код класса


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
bsa
Дата 10.2.2010, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(WiND @  10.2.2010,  13:28 Найти цитируемый пост)
А как в качестве параметра в CreateThread передать ссылку на CClient::Receiver()
а в _receiver(LPVOID data) просто вызвать ее? это позволит не делать Receiver публичным)
В моем коде сделано именно то, что ты хочешь. Receiver можешь делать каким угодно, хоть приватным, хоть защищенным.

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.