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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> выполнение метода класса в отдельном потоке 
:(
    Опции темы
Apel
Дата 15.11.2010, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Мне нужно, чтобы некоторая работа (чтение из сокета) постоянно выполнялась в отдельном потоке. Хотелось бы оформить всё это в виде класса, который управляет потоком и позволяет получить результат работы (пакет данных). Как я себе представляю, результат работы метода-потока должен помещаеться в private член-буфер и возвращаться public-методами.

Проблема: 

Функция CreateThread() не принимает в качестве параметра не static член класса, а из static члена не получается получить доступ к private членам.

Подозреваю, что если объявить функцию потока вне класса, то всё будет работать, а как нужно делать в рамках объектно-ориентированного подхода?
PM MAIL   Вверх
boostcoder
Дата 15.11.2010, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



boost::thread() и boost::bind() - все что тебе нужно.
лучше конечно boost.asio ;)

PM WWW   Вверх
kosmonaFFFt
Дата 15.11.2010, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно еще QThread из Qt или заюзать модуль QtNetwork...


--------------------
user posted image
PM MAIL ICQ   Вверх
Alexeis
Дата 15.11.2010, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Apel @  15.11.2010,  14:18 Найти цитируемый пост)
Функция CreateThread() не принимает в качестве параметра не static член класса, а из static члена не получается получить доступ к private членам.

  Зато у CreateThread есть LPVOID lpParameter - куда можно передать указатель на объект. Если функция будет static член класса, то доступ к private будет автоматически. Но насколько я знаю использование этой функции крайне не рекомендовано. Следует использовать _beginthread

Добавлено через 4 минуты и 44 секунды
Цитата(http://msdn.microsoft.com/en-us/library/ms682453%28VS.85%29.aspx)

A thread in an executable that calls the C run-time library (CRT) should use the _beginthreadex and _endthreadex functions for thread management rather than CreateThread and ExitThread; this requires the use of the multi-threaded version of the CRT. If a thread created using CreateThread calls the CRT, the CRT may terminate the process in low-memory conditions.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Apel
Дата 15.11.2010, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Объект то ещё не создан, как я могу передаь указатель?

из статического члена нет доступа к закрытым членам...


Код


class CReciver
{
    int PrivateMember;
              static DWORD WINAPI Comm(LPVOID Param)
{
public:
    
    CReciver();
    ~CReciver(void);
};

DWORD WINAPI CReciver::Comm(LPVOID Param)
{
    PrivateMember = 1;// ошибка

    return 0;
}


ошибка: не статическая ссылка не член должна указываться относительно заданного объекта.

Это сообщение отредактировал(а) Apel - 15.11.2010, 14:06
PM MAIL   Вверх
Alexeis
Дата 15.11.2010, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Apel @  15.11.2010,  15:04 Найти цитируемый пост)
Объект то ещё не создан, как я могу передаь указатель?

  Можно передать указатель, на указатель. Т.е. адрес переменной, в которой будет храниться адрес объекта. Эта переменная (с адресом объекта) должна существовать до момента, когда адрес объекта можно будет скопировать в локальную переменную потока, после чего ее можно уничтожить.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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