Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > эмитация для WinAPI


Автор: cthutq 4.8.2006, 12:42
есть например функция 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-ов

Автор: Daevaorn 4.8.2006, 12:54
cthutq, 
Код

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

При условии, что выравнивание правильное, если нет, тогда, в принципе, можно ждать сюрпризов.

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

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

Автор: cthutq 4.8.2006, 13:12
Цитата(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";
}


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

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

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

не совсем понял...

Автор: Romikgy 4.8.2006, 15:44
ты проблемку объясни получше , получше и посоветуем

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

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

Автор: cthutq 4.8.2006, 16:18
Цитата(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, которая хочет массив событий.

Автор: Romikgy 4.8.2006, 16:26
терь вопрос где?

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

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

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


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

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



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

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

при этом придется постоянно копировать (тоесть создавать) временный массив SOCKET что очень накладно

Автор: Romikgy 4.8.2006, 20:46
Цитата(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; }

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)