Форум: "Прочее";
Текущий архив: 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