Вход в Зоопарк ручных компьютеров
gps мониторинг, транспортная логистика, gps слежение
Опять ком порт. Подвисает поток.
"Карманная" версия Базара

 
Начать новую тему   Ответить на тему    Список Базаров Форумы Handy.ru -> Программирование для КПК
Предыдущая тема :: Следующая тема  
Автор Сообщение
VVolkov

Новый писатель


Зарегистрирован: 28.11.2005
Сообщения: 15

СообщениеДобавлено: Сб Фев 03, 2007 21:57    Заголовок сообщения: Опять ком порт. Подвисает поток. Ответить с цитатой

Ком порт открывается как синхронный для связи с Bluetooth.
Данные читаются в отдельном потоке. После закрытия программы, поток остается жить и не убивается системными
средствами( программа XGuru) .

Question

Все идеи исчерпаны.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Vladimir Koshelev

Новый писатель


Зарегистрирован: 20.11.2006
Сообщения: 18
Откуда: Novgorod

СообщениеДобавлено: Вс Фев 04, 2007 0:35    Заголовок сообщения: Re: Опять ком порт. Подвисает поток. Ответить с цитатой

VVolkov писал(а):
Ком порт открывается как синхронный для связи с Bluetooth.
Данные читаются в отдельном потоке. После закрытия программы, поток остается жить и не убивается системными
средствами( программа XGuru) .

без кода трудно что-либо сказать.
Читающий поток умеет распознаваль факт завершения программы и завершаться? По флагу или по эвенту, например?

_________________
=)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора MSN Messenger
VVolkov

Новый писатель


Зарегистрирован: 28.11.2005
Сообщения: 15

СообщениеДобавлено: Вс Фев 04, 2007 20:42    Заголовок сообщения: Ответить с цитатой

Завершается по флагу.

Код следующий (довольно стандартный)

Открытие порта

COMMTIMEOUTS ct;
m_hComm = CreateFile(lpCommPort,GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING, 0, NULL);
GetCommTimeouts (m_hComm, &ct);
ct.ReadIntervalTimeout=10;
ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant;
ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant;
DCB dcb;
GetCommState(m_hComm, &dcb);
dcb.BaudRate =CBR_115200;
dcb.Parity =NOPARITY;
dcb.StopBits =ONESTOPBIT;
dcb.ByteSize =8;
SetCommState(m_hComm, &dcb);
SetCommMask(m_hComm, EV_RXCHAR);

Чтение порта
DWORD InData(LPVOID lParam)
{
BYTE szBuffer[128];
DWORD dwEvtMask;
DWORD dwError;
DWORD dwBytes;
COMSTAT csStat;

CTermDlg *pWnd = (CTermDlg *)lParam;

while (!StopAll)
{
WaitCommEvent(pWnd->m_Modem.m_hComm, &dwEvtMask, NULL);
if (dwEvtMask & EV_RXCHAR)
{
ClearCommError(pWnd->m_Modem.m_hComm, &dwError, &csStat);

ReadFile(pWnd->m_Modem.m_hComm, szBuffer,csStat.cbInQue, &dwBytes, NULL);

for (UINT i = 0; i < csStat.cbInQue; i++)
pWnd->m_Modem.m_InBuffer.WriteChar(szBuffer[i]);
}
}

return 0;
}

Запуск чтения
m_pInThread = AfxBeginThread((AFX_THREADPROC)InData, this);
m_pInThread->m_bAutoDelete = TRUE;

Флаг StopAll =true устанвливается в функции OnClose диалогово окна.
Там же я запускаю TerminateThread(m_pInThread->m_hThread,0); - думал поможет. Neutral
OnClose() срабатывает а поток остается. Он на самом деле не сильно мешает, поскольку
порт закрыт и это позволяет запускать новые версии программы. Но удалить все висящие потоки их можно только перезагрузкой КПК.

Собираю под eMbeddet Visual C++. Запускаю под Window CE 4.20 Loox 410

Спасибо за внимание к вопросу.
V
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
VVolkov

Новый писатель


Зарегистрирован: 28.11.2005
Сообщения: 15

СообщениеДобавлено: Пн Фев 05, 2007 6:08    Заголовок сообщения: сигнал флагом Ответить с цитатой

Очень похоже, что в момент передачи флага StopAll в поток его уже
нет.
Вопрос: когда срабатывает функция OnClose() глобальные
переменные еще существуют ?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Vladimir Koshelev

Новый писатель


Зарегистрирован: 20.11.2006
Сообщения: 18
Откуда: Novgorod

СообщениеДобавлено: Пн Фев 05, 2007 23:45    Заголовок сообщения: Ответить с цитатой

VVolkov, есть несколько моментов, которые могут привести к зависанию потока.
1) Нет проверки на валидность pWnd. Оно может уже не существовать. Соответственно и pWnd->m_Modem.m_hComm так же может быть неверным
2) Если используешь глобальный флаг , то его изменение лучше защитить критической секцией
(впрочем, для однопроцессорной CE платформы это не важно)
3) Нет проверки на валидность хэндла порта, я так понимаю, что его CloseHandle делается в основной программе? Тогда во время работы потока хэндл может уже не существовать.
4) Имхо, одного EV_RXCHAR мало. А если данные вообще не идут? Может добавить еще и EV_ERR?

Скорее всего виснет где-то в районе WaitCommEvent.

_________________
=)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора MSN Messenger
VVolkov

Новый писатель


Зарегистрирован: 28.11.2005
Сообщения: 15

СообщениеДобавлено: Ср Фев 07, 2007 1:03    Заголовок сообщения: Есть куда плыть Ответить с цитатой

Спасибо.
Буду проверять.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
VVolkov

Новый писатель


Зарегистрирован: 28.11.2005
Сообщения: 15

СообщениеДобавлено: Чт Фев 15, 2007 23:46    Заголовок сообщения: Выводы Ответить с цитатой

Изнчально программа была написана для настольного компьютера и перенесена на КПК практически без изменений.

Результат
Программа работала, но очень не устойчиво и по завершению оставались подвисшие потоки. Shocked

Выяснились следующие особенности работы ком порта на КПК
Порты синхронные и эту часть программ нужно было переписать. Функциями WaitCommEvent и ClearCommError лучше не пользоваться. Т.е приостановить поток до прихода следующего символа и узнать сколько символов в буфере не удалось. Crying or Very sad

В результате в потоке чтения данных из ком порта чтение осуществляется посимвольно. Интересно,что WaitCommEvent вешает поток, а функция чтения ReadFile нет.
Были убраны другие архитектурные излишества - динамические буфера хорошо работающие на настольном компьютере, а здесь
нет.

В результате при перенесении программы на КПК весь код пришлось
переписать.

Спасибо за внимание V
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Slukad

Новый писатель


Зарегистрирован: 15.08.2007
Сообщения: 4

СообщениеДобавлено: Ср Авг 15, 2007 22:46    Заголовок сообщения: Ответить с цитатой

Не могли бы Вы выложить код где вообще открывается COM порт? Все мучаюсь не могу найти =(
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список Базаров Форумы Handy.ru -> Программирование для КПК Часовой пояс: GMT - 10
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять вложения в этом форуме
Вы можете просматривать вложения в этом форуме



Форумы Handy.ru 


Powered by phpBB © 2001 phpBB Group