Вниз
Скачать: CL | DM;

наследование OVERLAPPED   Найти похожие ветки 

 
Polevi ©   (2002-09-06 14:38) [0]

Люди помогите разобраться..
Работаю с портами завершения ввода-вывода.
Создаю свой класс-наследник структуры OVERLAPPED

class CDispatcher:public OVERLAPPED
{
public:
CDispatcher(SOCKET acceptSocket, SOCKET connectSocket)
{
Offset=0;
OffsetHigh=0;
Internal=0;
InternalHigh=0;
hEvent=0;
m_bufSize=8192;
m_buffer=VirtualAlloc(NULL,m_bufSize,MEM_COMMIT, PAGE_READWRITE);
m_status=FREE;
m_acceptSocket=acceptSocket;
m_connectSocket=connectSocket;
}

void Complete(DWORD dwNumBytes)
{
switch (m_status)
{
case READING: //завершилась операция чтения
ReadComplete(dwNumBytes);
break;
case WRITING: //завершилась операция записи
m_status=FREE; //готовы к чтению
case FREE:
ReadFile((HANDLE)m_acceptSocket,m_buffer,m_bufSize,NULL,this);
m_status=READING; //началась операция чтения
}
}

void ReadComplete(DWORD dwNumBytes)
{
WriteFile((HANDLE)m_connectSocket,m_buffer,dwNumBytes,NULL,this);
m_status=WRITING; //началась операция записи
}

private:
PVOID m_buffer;
DWORD m_bufSize;
int m_status;
SOCKET m_acceptSocket, m_connectSocket;
};


вот так выглядит поток, выбирающий сообщения из порта завершения

DWORD WINAPI WorkThreadProc(LPVOID lpParameter)
{
DWORD dwNumBytes, CompKey;
CDispatcher *disp;
for (;;)
if (GetQueuedCompletionStatus(FCompPort->Handle,&dwNumBytes,
&CompKey, (OVERLAPPED **)&disp,INFINITE) && (dwNumBytes>0))
{
disp->Complete(dwNumBytes);
}
else
....
....
}

Все отлично работает, но !!!
При попытке сделать ф-ию ReadComplete виртуальной - объект портится - то есть когда в порту появляется сообщение о завершении асинхронной операции - управление передается в ReadComplete но все поля объекта содержат мусор... (кроме OVERLAPPED !!!)
Давно не занимался C++ - может ошибка очевидна, но не для меня :-)


 
Polevi ©   (2002-09-06 14:49) [1]

PS
>управление передается в ReadComplete
то есть в Complete



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.012 c
1-68702
ultrasuper_asd
2002-10-10 23:31
2002.10.21
Как выровнять текст в RichEdit?


3-68626
MAXL
2002-09-29 20:30
2002.10.21
В SQL EXPLORE создал алиас для базы MSACCES97 , но


1-68748
Valt
2002-10-11 13:44
2002.10.21
Что-нибудь типа stringgrid, но круче?


14-68931
Mike B.
2002-09-26 12:01
2002.10.21
ICQ


14-69000
MJH
2002-09-29 04:58
2002.10.21
ВНИМАНИЕ!!! СУПЕРБАГ!!!!!




   Наверх