Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.11.25;
Скачать: [xml.tar.bz2];

Вниз

исключение - 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.044 c
10-1140499983
rosl
2006-02-21 08:33
2007.11.25
excel


2-1194028039
Ореол
2007-11-02 21:27
2007.11.25
Форма из *.dll


2-1193743022
Reni
2007-10-30 14:17
2007.11.25
tmemorystream-> string?


3-1184329640
NKT
2007-07-13 16:27
2007.11.25
Перезапись файла *.bf MS DOS в формат Delphi (база .gdb)


4-1179215547
allucard
2007-05-15 11:52
2007.11.25
Поменять обои рабочего стола





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский