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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> эмитация для WinAPI 
:(
    Опции темы
cthutq
Дата 4.8.2006, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



есть например функция WaitForMultipleObject

она просит на вход массив описателей
Код

HANDLE h_array[...];


я хочу создать класс-обертку, которая в конструкторе принимает
описатель, а в деструкторе закрывает его
Код

class Object {
private :
    HANDLE m_handle;

    Object (const Object&);
    Object& operator = (const Object&);

public :
    Object (HANDLE handle) : m_handle (handle) {;}
    ~Object () { CloseHandle (m_handle); }

         operator HANDLE () { return m_handle; }
};


а теперь я хочу подсунуть для WaitForMultipleObject вектор объектов Object

но на сколько я понимаю эта функция просто оперирует указателем на начало массива
и каждый раз просто разыменовывает указатель.

или просто работает как с массивом
как можно прозрачно создать вектор таких объектов чтоб WaitForMultipleObject работала с ним как с обычным массивом ?

P.S. Тоесть нужен объект-контейнер, который внутри будет хранить массив объектов, а для WinAPI предоставлять массив HANDLE-ов

PM MAIL   Вверх
Daevaorn
Дата 4.8.2006, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



cthutq, 
Код

std::vector< Object > array;
WaitForMultipleObject( array.size(), &array[0], ... );

При условии, что выравнивание правильное, если нет, тогда, в принципе, можно ждать сюрпризов.
PM MAIL WWW   Вверх
Romikgy
Дата 4.8.2006, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(cthutq @  4.8.2006,  11:42 Найти цитируемый пост)
а теперь я хочу подсунуть для WaitForMultipleObject вектор объектов Object

А че в классе нельзя вызвать этот вейт?
напиши метод в котором он и будет вызываться используя приватные укалатели на массив хендлов


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

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


Шустрый
*


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

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



Цитата(Daevaorn @  4.8.2006,  12:54 Найти цитируемый пост)
При условии, что выравнивание правильное, если нет, тогда, в принципе, можно ждать сюрпризов. 

да в том то и дело, что Object может иметь размер > sizeof(HANDLE)


Цитата(Romikgy @  4.8.2006,  13:02 Найти цитируемый пост)
А че в классе нельзя вызвать этот вейт?
напиши метод в котором он и будет вызываться используя приватные укалатели на массив хендлов 

придется постоянно создавать из массива Object массив HANDLE

например
Код

class A
{
private:
    int i;
    double d;
public:
    A () : i(1), d(77.83) {};
    operator int()
    {
        return i;
    }
};

class B
{
private :
    std::vector<A> m_vec;

public :
    void add (const A& a)
    {
        m_vec.push_back(a);
    }

    operator int* ()
    {
             static std::vector<int> temp;
        temp.clear();
        std::for_each (     
            m_vec.begin(), m_vec.end(), 
            boost::bind (
                &std::vector<int>::push_back, &temp, _1 
            )
        );
        return &temp[0];
    }
};

int main(int argc, char* argv[])
{
    B b;
    b.add(A());
    b.add(A());
    b.add(A());
    b.add(A());
    b.add(A());

    int* p = b;
    for (int i = 0; i < 5; ++i)
        std::cout << *(p + i) << "\n";
}


PM MAIL   Вверх
Romikgy
Дата 4.8.2006, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(cthutq @  4.8.2006,  12:12 Найти цитируемый пост)
придется постоянно создавать из массива Object массив HANDLE

зачем?
создай тогда класс где будут собиратся все объекты в кучу,
и код для чего приведен?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
cthutq
Дата 4.8.2006, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Romikgy @  4.8.2006,  15:20 Найти цитируемый пост)
зачем?
создай тогда класс где будут собиратся все объекты в кучу,

не совсем понял...
PM MAIL   Вверх
Romikgy
Дата 4.8.2006, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



ты проблемку объясни получше , получше и посоветуем

Цитата(cthutq @  4.8.2006,  11:42 Найти цитируемый пост)
я хочу создать класс-обертку

на кой надо этот класс с одним хенделом? можно в нем весь массив хенделов хранить


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
cthutq
Дата 4.8.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Romikgy @  4.8.2006,  15:44 Найти цитируемый пост)
ты проблемку объясни получше , получше и посоветуем

описатель представляет собой SOCKET. Обертка нужна для создания и удаления описателя.
Кроме того с этой оберткой удобнее читать и писать в сокет.

Есть сервер, который хранит вектор этих объектов (Socket).
Есть массив событий, которые ассоциированны с сокетами.

Код

class Socket
{
private :
   SOCKET m_socket;
   Socket (const Socket&);
   Socket& operator = (const Socket&);
public :
   Socket (SOCKET socket) : m_socket (socket) {;}
   ~Socket () { closesocket (m_socket); }
   operator SOCKET const () { return m_socket; }
}

class Event
{
private :
   WSAEVENT m_event;
   Event(const Event&);
   Event& operator = (const Event&);
public :
   Event(WSAEVENT event) :m_event(event) {;}
   ~Event() { WSACloseEvent(m_event); }
   operator WSAEVENT const () { return m_event; }
}

class Server
{
private :
   std::map<Socket, Event> m_sockets;
}

Но сервер использует WinAPI функцию WSAWaitForMultipleEvents, которая хочет массив событий.
PM MAIL   Вверх
Romikgy
Дата 4.8.2006, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



терь вопрос где?

Добавлено @ 16:29 
логичнее всего было бы написать метод сервера с вызовом этой функции (вейта)
а в классе сокета, создать метод который отдает указатель на хендл сокета


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
cthutq
Дата 4.8.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Romikgy @  4.8.2006,  16:26 Найти цитируемый пост)
терь вопрос где?

он был в самом начале (ну и название темы smile)


Цитата(Romikgy @  4.8.2006,  16:26 Найти цитируемый пост)
а в классе сокета, создать метод который отдает указатель на хендл сокета 

а оператор у меня на что в классе Socket



Цитата(Romikgy @  4.8.2006,  16:26 Найти цитируемый пост)
логичнее всего было бы написать метод сервера с вызовом этой функции (вейта)

так он и выполняется в методе сервера. Только сервер хранит массив Socket, а не массив SOCKET

при этом придется постоянно копировать (тоесть создавать) временный массив SOCKET что очень накладно
PM MAIL   Вверх
Romikgy
Дата 4.8.2006, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(Romikgy @  4.8.2006,  15:26 Найти цитируемый пост)
создать метод который отдает указатель на хендл сокета

ты читал это?
весь язык си построен на указателях имхо
Цитата(cthutq @  4.8.2006,  15:55 Найти цитируемый пост)
а оператор у меня на что в классе Socket


Цитата(cthutq @  4.8.2006,  15:18 Найти цитируемый пост)
operator SOCKET const () { return m_socket; }

вот это чтоли?
дык указатель на него передай а не сам объект


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

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


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

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