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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Классы: как "организовать" такой код? 
V
    Опции темы
Alca
Дата 12.12.2009, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

void vOnExitHandle() {
    //...
}
//...
CWorkThread *pthThread = new CWorkThread();
pthThread->m_uiIndex = i;
pthThread->vOnExit   = vOnExitHandle;    //как "организовать" такой код ???

pthThread->bCreate();
pthThread->bResume();



--------------------
PM WWW ICQ Skype Jabber   Вверх
Alexeis
Дата 12.12.2009, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Alca, вопрос в чем? Как создавать обработчики или как выполнить финальный обработчик контексте основного потока?


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

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

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


Эксперт
****


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

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



Как создавать обработчики

Добавлено через 1 минуту и 47 секунд
Код

pthThread->vOnExit = ...



--------------------
PM WWW ICQ Skype Jabber   Вверх
Alexeis
Дата 12.12.2009, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



объявить в классе переменную указатель на функцию. Примерно так.
Код

...
void (*vOnExit) (void);
...


Добавлено через 1 минуту и 50 секунд
  Эта тема хорошо раскрыта тут http://alenacpp.blogspot.com/2007/04/blog-post.html

Это сообщение отредактировал(а) Alexeis - 12.12.2009, 21:09


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

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

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


Эксперт
****


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

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



Ок. А как внутри класса CWorkThread "прикрутить" этот указатель?

Это сообщение отредактировал(а) Alca - 12.12.2009, 21:15


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alexeis
Дата 12.12.2009, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(Alca @  12.12.2009,  20:15 Найти цитируемый пост)
Ок. А как внутри класса CWorkThread "прикрутить" этот указатель?

  Собственно я это и написал. 
Код

class CWorkThread
{
...
public:
  void (*vOnExit) (void);
...
};
 

А присвоение обработчика уже показано тут 

Цитата(Alca @  12.12.2009,  19:38 Найти цитируемый пост)
pthThread->vOnExit   = vOnExitHandle;    //как "организовать" такой код ???


Именно так и нужно.



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

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

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


Эксперт
****


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

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



Сейчас гляну. Спасибо.

Добавлено @ 21:21
Код

class CWorkThread
{
...
public:
  void (*vOnExit) (void);
  void vMethodA() {
      vOnExit();  //надо вызвать метод внутри класса
  }
...
};



Это сообщение отредактировал(а) Alca - 12.12.2009, 21:42


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alexeis
Дата 12.12.2009, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



вызывается по другому
Код

(*vOnExit)();



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

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

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


Опытный
**


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

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



если CWorkThread - часть библиотеки, а обработчик предоставляет пользователь, лучше использовать шаблоны или boost::function<>
PM MAIL   Вверх
Alca
Дата 12.12.2009, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

если CWorkThread - часть библиотеки, а обработчик предоставляет пользователь, 

 smile 
Цитата

лучше использовать шаблоны или boost::function<>

не хочеться буст прикручивать 


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 12.12.2009, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



а как вызвать vOnExit из статического метода класса?

Добавлено через 12 минут и 1 секунду
вроде так:
Код

...
pthThis->vOnExit(); 
...



--------------------
PM WWW ICQ Skype Jabber   Вверх
Alexeis
Дата 12.12.2009, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(Alca @  12.12.2009,  21:33 Найти цитируемый пост)
а как вызвать vOnExit из статического метода класса? 

  Можно, если статический метод получает как параметр указатель на экземпляр объекта.


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

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

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


Эксперт
****


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

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



Со статическим методом вроде разобрался.

пытаюсь присвоить обработчик:
Код

UINT CXThreadPool::uiOnRun(VOID *pData) { 
    ....
    pthThread->vOnExit   = _vOnTest; 
    ...
}
   
Код

Error    1    error C3867: 'CXThreadPool::_vOnTest': function call missing argument list; use '&CXThreadPool::_vOnTest' to create a pointer to member    d:\xlib\source\sync\cxthreadpool.cpp    205
Error    2    error C2440: '=' : cannot convert from 'void (__thiscall CXThreadPool::* )(void)' to 'void (__cdecl *)(void)'    d:\xlib\source\sync\cxthreadpool.cpp    205

 smile

Добавлено @ 22:52
1-ю ошибку исправил
Код

pthThread->vOnExit   = &CXThreadPool::_vOnTest; 

Как вторую решить?
Код

Error    1    error C2440: '=' : cannot convert from 'void (__thiscall CXThreadPool::* )(void)' to 'void (__cdecl *)(void)'    d:\xlib\source\sync\cxthreadpool.cpp    205




Это сообщение отредактировал(а) Alca - 12.12.2009, 22:57


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alexeis
Дата 12.12.2009, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



  Компилятор прав функция класса и функция это разные вещи. функция класса + указатель на объект нам дают уже замыкание. Это совсем другая конструкция. На билдере это делается через расширение языка __closure . В студии тоже что-то такое есть, но я уже не помню 


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

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

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


Опытный
**


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

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



Цитата(Alca @  12.12.2009,  21:38 Найти цитируемый пост)
не хочеться буст прикручивать  

Ну, ежели нужен велосипед, то мог бы сойти такой:
Код

#include <iostream>
#include <memory>

class Functor{
public:
    virtual void operator()() const = 0;
    virtual ~Functor(){}
};

class Object{
public:
    void toCall(){
        std::cout<<"Object::toCall is invoked"<<std::endl;
    };

    void toCall() const{
        std::cout<<"const Object::toCall is invoked"<<std::endl;
    };

    Functor* createFunctor(){
        class OFunctor: public Functor{
            Object& _ref;
        public:
            OFunctor(Object& ref): _ref(ref){}
            virtual void operator()() const{
                _ref.toCall();
            }
        };

        return new OFunctor(*this);
    }

    Functor* createFunctor() const{
        class OFunctor: public Functor{
            const Object& _ref;
        public:
            OFunctor(const Object& ref): _ref(ref){}
            virtual void operator()() const{
                _ref.toCall();
            }
        };

        return new OFunctor(*this);
    }
};

int main () {

    Object obj;
    std::auto_ptr<Functor> ptr(obj.createFunctor());
    (*ptr)();

    const Object cobj;
    std::auto_ptr<Functor> cptr(cobj.createFunctor());
    (*cptr)();

    return 0;
}


Это сообщение отредактировал(а) Леопольд - 13.12.2009, 21:50


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0618 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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