![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Mrsergei |
|
|||
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 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 25.3.2002 Репутация: нет Всего: 2 |
Была подобная праблема с синхронными сокетами. Решилась следующим способом:
1. Создаем отдельный поток. 2. В него запихиваем работу с сокетом (или портом). 3. Синхронизируем при помощи CEvent. 4. Ждем WaitForSingleObject-ом нашего события. Пример:
Удачи ![]() |
|||
|
||||
MrSergei |
|
|||
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 |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |