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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> pthread_create(&p,NULL,run,func_pointer), передать в ф-цию run указатель на ф-цию  
:(
    Опции темы
zaytsewa
Дата 9.4.2009, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



хочется передать в функцию run в качестве параметра указатель на другую функцию (другого класса)

реально ли это сделать??

в ф-ции run func_pointer не воспринимается как указатель на функцию((

Код


template <class T>
Thread::Thread(string& (T::*user_func)()) {

    pthread_create(&fd,NULL,run,user_func); 
    fds[0].fd = fd;
    fds[0].events = POLLIN;
    nfds = 1;
}


void* Thread::run(void* user_func) 
{

    while (1)
    {
        poll(fds,nfds,-1);
        if (fds[0].revents == POLLIN) // данные на входе файлового дескриптора
            {
                user_func(); // запускаем ф-цию польз-ля
            }
    }
}


Это сообщение отредактировал(а) zaytsewa - 9.4.2009, 14:59
PM MAIL   Вверх
azesmcar
Дата 9.4.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



Цитата

реально ли это сделать??

да

Цитата

в ф-ции run func_pointer не воспринимается как указатель на функцию((

ну ясное дело smile это же указатель на void, откуда компилятору знать что ты туда указатель на функцию передаешь. Сделай cast.
дам пример, а там разберешся думаю
Код

#include <iostream>

typedef void *userfunc(void);

void foo()
{
    std::cout << "Hello world!" << std::endl;
}

void run(void* func)
{
    ((userfunc*)func)();
}

int main()
{
    run( foo );
}


zaytsewa
а вообще некоторые указатели на функции могут занимать больше памяти чем может содержать void*, так что лучше передавай указатель на указатель или заверни в структуру.



Это сообщение отредактировал(а) azesmcar - 9.4.2009, 15:58
PM   Вверх
X-3R1
Дата 10.4.2009, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я заметил: 
Код

pthread_create(&fd,NULL,run,user_func);

где run:
Код

void* Thread::run(void*);


Но ведь pthread_create ожидает функции void (*func)(void*), а не void (T::*func)(void*). Разве это скомпиллируется ? 
И ещё такой вопрос, как работать с сишными API которые ожидают указатель на функцию (signal, pthread_create etc) в ООП. Как-нибудь можно стандартными средствами языка C++ передать такой функции указатель на метод класса, а не указатель на статический метод или глобальную функцию ? Вроде бы знаю что boost::bind нечто подобное умеет.

Это сообщение отредактировал(а) X-3R1 - 10.4.2009, 10:33
PM MAIL   Вверх
MAKCim
Дата 10.4.2009, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(X-3R1 @  10.4.2009,  10:24 Найти цитируемый пост)
Как-нибудь можно стандартными средствами языка C++ передать такой функции указатель на метод класса, а не указатель на статический метод или глобальную функцию ?

нет


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
azesmcar
Дата 10.4.2009, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



X-3R1
если функция статическая - сработает

Добавлено через 1 минуту и 4 секунды
X-3R1
можно сделать статическую и передавать ей this. А из нее вызывать соответствующую мембер функцию
PM   Вверх
X-3R1
Дата 10.4.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(MAKCim @  10.4.2009,  08:38 Найти цитируемый пост)
нет 

можно =)))
Цитата(azesmcar @  10.4.2009,  08:40 Найти цитируемый пост)
можно сделать статическую и передавать ей this. А из нее вызывать соответствующую мембер функцию 

да ты прав =) Уже написал враппер:

Код

template <class T, void (T::*method)(void)>
void wrap_func(void* pObj)
{
    T *obj = static_cast<T *>(pObj);
    (obj->*method)();
}



PM MAIL   Вверх
azesmcar
Дата 10.4.2009, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



X-3R1
Цитата

можно =)))

нет smile нельзя
то что я написал это обходное решение того что тебе нужно. А передать мембер функцию как ThreadProc - нельзя.
PM   Вверх
X-3R1
Дата 10.4.2009, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(azesmcar @  10.4.2009,  09:46 Найти цитируемый пост)
то что я написал это обходное решение того что тебе нужно. А передать мембер функцию как ThreadProc - нельзя. 

Это уже не важно, главное что теперь:
Код

pthread_create( ..., wrap_func<Thread, &Thread::run>, this );

работает. И wrap_func не обязательно делать глобальной функцией или статическим методом.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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