В поисках потенциальных опасностей при использовании критического раздела в моем приложении я прочитал несколько ответов в SO, которые вдохновили меня.
Я написал код ниже, рациональность его проста;
- Поток работает до тех пор, пока не будет завершен при завершении работы приложения.
- Add(request1, request2, host, port) используется для добавления элемента в std::queue.
- убедитесь, что между запросами на отправку есть временная задержка
- проверяется размер очереди, если размер > 0, выполняется задание
- DispatchRequest к TThreadComponent, который создает один поток.
- удалить (извлечь) элемент очереди
Я запустил код, и он работает нормально и соответствует ожиданиям.
Основное приложение остается отзывчивым, пока работает этот поток.
Мой вопрос в том, может ли кто-нибудь увидеть потенциальные проблемы, на которые я должен обращать внимание.
В отсутствие более конкретного кода, который будет использовать этот поток, я надеюсь, что его достаточно для тех, кто имеет опыт работы с потоками, чтобы определить потенциальные опасности и дать советы по улучшению.
Ваше здоровье
void __fastcall TSentinal::Execute()
{
//---- Place thread code here -------------------
//
// using std::queue to request reading a modbus
// device via a thread component, component
// creates the reading thread which terminates
// after read,
//-----------------------------------------------
if (!InitializeCriticalSectionAndSpinCount(&gateKeeper, 0x00000400) )
return;
Priority = tpNormal;
FreeOnTerminate = true;
span.start = clock();
while(!Terminated)
{
//---------------------------------------------------
// wait for millisec_delay between DispatchRequests
// to ensure time for other thread to complete its
// task...
//---------------------------------------------------
millisec_delay = 500;
while(!span.dispatch(millisec_delay))
continue;
if((size_t)q.size() > 0)
{
span.start = clock();
EnterCriticalSection(&gateKeeper);
//-----------------------------------------------
// ensure that request is completed before
// continuing,
//
// DispatchRequest() creates thread to read modbus
// device via serial server, on completion, thread
// is terminated,
//-----------------------------------------------
FTc->DispatchRequest(false, q.c[0]);
//-----------------------------------------------
// remove from queue
//-----------------------------------------------
q.pop();
LeaveCriticalSection(&gateKeeper);
}
}
DeleteCriticalSection(&gateKeeper);
}