Главная страница
    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.045 c
2-1193996679
Dmitry_177
2007-11-02 12:44
2007.11.25
как сделать понулям секунды в TDateTime?


15-1193393342
Kerk
2007-10-26 14:09
2007.11.25
Синхронизация потоков


3-1184321322
Bogdan1024
2007-07-13 14:08
2007.11.25
тип параметра "множество"


2-1193818997
bioSerg
2007-10-31 11:23
2007.11.25
Invalid Floating Point Operation и NAN


15-1192464844
oxffff
2007-10-15 20:14
2007.11.25
Yield средствами Delphi. За и против.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский