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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WaitForSingleObject, Использование WaitForSingleObject 
:(
    Опции темы
Mrsergei
  Дата 21.5.2002, 02:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Помогите, пожалуйста, с WaitForSingleObject. Совсе не получается обработать приходящий сигнал. Вначале шлется сообщение на устройство, а потом приходит ответный сигнал, если устройство не сигналит, то как прервать ожидание сигнала?
Пытался использовать WaitForSingleObject, так он не срабатывает

HANDLE  port;
DWORD   bc;
DCB     dcb;
char    buffer[100];
char    *buf_out="50";
DWORD   dwBlockSize=512;
void    *szBuffer;
int zapros=255;
DWORD dwEvtMask;
OVERLAPPED over;
char* ch;


ZeroMemory(&dcb,sizeof(DCB));

strcpy(buffer,"baud=1200 parity=N data=8 stop=1");
BuildCommDCB((char*)&buffer,&dcb);  
dcb.fRtsControl = RTS_CONTROL_ENABLE;

port=CreateFile("COM1",
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);

GetCommState(port,&dcb);

if(port==INVALID_HANDLE_VALUE)
{
AfxMessageBox("Не возможно открыть последовательный порт.");
CloseHandle(port);  
return;
}

SetCommState(port,&dcb);
SetCommMask(port, EV_DSR);

memset(&over,0,sizeof(over));
over.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);

szBuffer = malloc(dwBlockSize);
memset(szBuffer, zapros, dwBlockSize);

WriteFile(port,szBuffer,sizeof(szBuffer),&bc,&over);

free(szBuffer);

          //////////////////////////////////////////////////////////////////////////
          //Здесь необходимо обработать принятый сигнал, только вот как?
          //Если нет сигнала, то WaitCommEvent ждет вечно, а необходимо
          // к примеру пять секунд ожидания, и если нет сигнала от устройства,
          //то прервать процесс. Как правильно использовать WaitForSingleObject?
          //Что необходимо написать в коде?
          //////////////////////////////////////////////////////////////////////////

WaitCommEvent(port, &dwEvtMask, NULL);
if (dwEvtMask & EV_DSR)
//Действие
HeapFree(GetProcessHeap(),0,&dcb);
CloseHandle(port);
CloseHandle(over.hEvent);
  Вверх
Lion
Дата 21.5.2002, 06:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Была подобная праблема с синхронными сокетами. Решилась следующим способом:

1. Создаем отдельный поток.
2. В него запихиваем работу с сокетом (или портом).
3. Синхронизируем при помощи CEvent.
4. Ждем WaitForSingleObject-ом нашего события.

Пример:

Код

m_pDevThreade=new CDevThreade;
m_pDevThreade->CreateThread();
DWORD dRes=::WaitForSingleObject(m_Event, 5000);
if(dRes==WAIT_TIMEOUT)
{
   AfxMessageBox("Ошибка системы\n"
     "Не могу создать проток для работы с устройством!",MB_ICONERROR);
   delete m_pDevThreade;
   m_pDevThreade=NULL;
   return FALSE;
}


Удачи  ;)
PM MAIL   Вверх
MrSergei
Дата 23.5.2002, 15:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Как при помощи потоков, организовать событие?
Т.е. все что относится к работе с портом засунуто в отдельный поток,
как WaitForSingleObject заставить откликаться на событие от потока,
т.е. если поток, к примеру, после ожидания 5-ти секунд все еще работает,
то как все это облечь в событие, т.е. чтобы на поток реагировал WaitForSingleObject?

CWinThread*  m_pthread;
friend UINT PortThread(LPVOID lpParam);
m_pthread = AfxBeginThread(PortThread, this, THREAD_PRIORITY_NORMAL,0, CREATE_SUSPENDED, NULL);

               OVERLAPPED over;
memset(&over,0,sizeof(over));
over.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);

// Событие == отклик от потока? Как сделать?

if (WaitForSingleObject(over.hEvent, 5000)==WAIT_OBJECT_0)
//Полезное действие
else
AfxMessageBox("Проверте подключение устройства!");

m_pthread->m_bAutoDelete = FALSE;
m_pthread->ResumeThread();

UINT PortThread(LPVOID lpParam)
{
//Куча кода, работающего с портом
return 0;
}
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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