Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.25;
Скачать: CL | DM;

Вниз

исключение - EPrivilege   Найти похожие ветки 

 
Tonich ©   (2007-10-24 15:39) [0]

Возникла такая проблемка..
есть сервис, который запускает несколько потоков (для отладки 1 запускает) для прослушивания нескольких ком-портов.
На 1 ком-порт может быть подключено до 64 устройств. (для отладки подключено 2). Между чтением каждого устройства установлен тайм-аут, для того что бы оно успело отвечать. Так вот собственно проблема, когда устанавливается тайм-аут порядка 10 мс (ну это устройство не успевает отвечать за столько малый промежуток, но не в этом дело) выскакивает исключение EPrivilege, как избавится?? когда задержка порядка 500 мс, все нормально


 
Сергей М. ©   (2007-10-24 15:41) [1]

EPrivilege is raised when an application tries to execute a processor instruction that is invalid for the current processor privilege level

По-русски, у тебя ошибка в 17-й строке.


 
Tonich ©   (2007-10-24 15:51) [2]

да нет я могу привести код. но он на с++ ))
да и много там всего , и даже не понятно хде именно вылетает ошибка
вот собственно опрос устройств тут происходит

> void __fastcall TCollectingThread::Execute()
> {
>  try
>  {
>     try
>      {
>         while (!Terminated)
>          {
>           for (int ii = 0; ii<=DeviceCount-1; ii++)
>            {
>
>              TDevice *Dvc = GetCurrentDvc(ii);
>
>                SetDvcControlByte(Dvc);
>                SetDvcStrMessage(Dvc);
>
>                Wait(FReadTimeOut);
>
>                GetDvcControlByte(Dvc);
>
>            }
>
>          }
>      if (FFinaleThread) FFinaleThread((TObject *)this,FIndex,
> DeviceCOM->Name,etStopThread,DeviceCOM->Name);
>      }
>     __finally
>      {
>       ClosePort();
>      }
>  }
>  catch(Exception &Ex)
>  {
>   if (FFinaleThread) FFinaleThread((TObject *)this,FIndex,
> DeviceCOM->Name,etError,DeviceCOM->Name+" "+Ex.Message);
>
>  }


 
Сергей М. ©   (2007-10-24 15:52) [3]

Кстати, за каким лешим понадобился таймаут, если на то есть блокирующее чтение ?


 
Сергей М. ©   (2007-10-24 15:53) [4]


> GetDvcControlByte


Что творится в ее теле ?


 
Tonich ©   (2007-10-24 15:56) [5]


> Кстати, за каким лешим понадобился таймаут, если на то есть
> блокирующее чтение ?

хм согласен..


int __fastcall TCollectingThread::GetCOMPort(unsigned char *buff)
{
if (COM == NULL) return 1;
try
{

 int DataLen = COM->WaitingData();
 if (COM->LastError != 0) throw Exception(COM->LastErrorDesc);

 if (DataLen != 0)
  {
   COM->RecvBuffer(buff,DataLen);
   if (COM->LastError != 0) throw Exception(COM->LastErrorDesc);
  }

 return 0;
}
catch(Exception &Ex)
{
 throw;
}
}


void __fastcall TCollectingThread::GetDvcControlByte(TDevice *Device)
{
try
{
 BYTE buff[MAX_BUFFER_SIZE];

 GetCOMPort(buff);

//  CrlSection->Enter();
 try
  {
   if ((strlen(buff) == 3) && (buff[0] == buff[2]))
    {
      Device->State     = dsWork;
      Device->InputByte = buff[1];
    } else
          {
            Device->State     = dsError;
            Device->InputByte = "\0";
          }
  }
 __finally
  {
//    CrlSection->Leave();
  }

}
catch(Exception &Ex)
{
 throw;
}
}


 
Сергей М. ©   (2007-10-24 15:57) [6]


> как избавится?


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


 
Сергей М. ©   (2007-10-24 15:58) [7]


>  BYTE buff[MAX_BUFFER_SIZE];
>
>  GetCOMPort(buff);
>


Так-с .. Подозрения в [6] укрепляются ..

Показывай тело ..


 
Сергей М. ©   (2007-10-24 15:59) [8]


> стека как контейнера лок.переменных


Точнее, в дан.ситуации контейнера адресов возврата.


 
Сергей М. ©   (2007-10-24 16:02) [9]


> COM->RecvBuffer(buff,DataLen);


[6] как раз и случится в ситуации, когда DataLen > MAX_BUFFER_SIZE.


 
Tonich ©   (2007-10-24 16:07) [10]

ну MAX_BUFFER_SIZE = 256 а устройство никогда не может вернуть столько
ща буим проверять так что в данном случаи буфер лучше сделать просто полем класса?


 
Сергей М. ©   (2007-10-24 16:20) [11]


> устройство никогда не может вернуть столько


Зато несколько устройств могут ответить разом.


> буфер лучше сделать просто полем класса?
>


Тогда схлопочешь AV)

Читать нужно ровно столько, сколько ожидается и не более размера буфера.



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

Текущий архив: 2007.11.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
15-1193397825
vajo
2007-10-26 15:23
2007.11.25
Нужно внести изменение в текстовом файле на сайте.


2-1194204107
olegusis
2007-11-04 22:21
2007.11.25
переменные


6-1174642598
StrangerMX
2007-03-23 12:36
2007.11.25
TIdNNTP


11-1177863828
Rusya
2007-04-29 20:23
2007.11.25
Вопрос по OnBeforeCreateWindow


2-1193910412
werb
2007-11-01 12:46
2007.11.25
Узнать включен комп или нет