Глюки при работе с потоком
От: stepanov_i  
Дата: 03.04.07 07:02
Оценка:
Добрый день!!!

Есть небольшая программка, которая постоянно опрашивает устройство через COM-порт. Для этого сделано 2 потока:
— первый постоянно шлет запросы на устройство (1 раз в 15 секунд), для этого там создан таймер.
— второй постоянно считывает информацию с COM-порта: также через таймер 1 раз в 100мс...

Столкнулся с такой проблемой: почему-то если создавать оба потока, то происходит такой глюк: таймер, в котором происходит отправка сообщения на устройство обрабаывается всего 1 раз, доходит до функции ReadFile, и дальше просто вылетает из потока.
Такая же картина происходит и во время отправки данных на порт, при первом вызове WriteFile вылетает из потока!

Если же создавать только один поток для записи информации в устройство, то таймер работает как часы, все постоянно отправляет...

С чем может быть проблема?!
Вот код:

создание потоков:
hThreadRead = CreateThread (NULL, 0, ThreadReadProc, NULL, CREATE_SUSPENDED, &dwThreadReadId);
hThreadWrite = CreateThread (NULL, 0, ThreadWriteProc, NULL, 0, &dwThreadWriteId);


DWORD WINAPI ThreadReadProc (LPVOID lpParam)
{
MSG mess2;
SetTimer (NULL,ID_TIMER_READ,100, ThreadReadTimerProc);

while (GetMessage(&mess2,NULL,0,0))
DispatchMessage(&mess2);
}

BYTE buf_in[12];
void CALLBACK ThreadReadTimerProc(HWND,UINT,UINT,DWORD)
{
if ((ComHANDLE!=NULL)
if (!ReadFile(ComHANDLE,buf_in,12,&bc,NULL))
MessageBox (hMainWnd,"Невозможно считать информацию с порта","Ошибка",MB_ICONHAND);
else
MessageBox (NULL,TEXT("......"),"Получены данные",MB_OK);
return;
}



DWORD WINAPI ThreadWriteProc (LPVOID lpParam)
{ // поток для отправки информации на устройство... 1 раз в 15 секунд должен отрабатывать
MSG message;
SetTimer (NULL,0,15000, ThreadWriteTimerProc);

while (GetMessage(&message,NULL,0,0))
DispatchMessage(&message);
return 0;
}
void CALLBACK ThreadWriteTimerProc(HWND,UINT,UINT,DWORD)
{ // каждые 15 секунд необходимо отправлять информацию на устройства
static BYTE nSendData[7];
DWORD numbytes;

if (!ComHANDLE)
return;
else
{
for (int i = 1; i <= 32/*0x5*/; i++)
{
nSendData[3] = i;
// подсчет контрольной суммы
nSendData[5] = nSendData[1] + nSendData[4] + nSendData[2] + nSendData[3];
nSendData[5] = 0 — nSendData[5];
bool bRez = WriteFile(ComHANDLE,nSendData,7,&numbytes,NULL);
if (! bRez)
MessageBox (NULL, "Невозможно отправить данные", szCOM, MB_OK);
else
{
Sleep(450);
continue;
}
}
}
return;
}

03.04.07 11:08: Перенесено модератором из 'C/C++' — Odi$$ey
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.