В поисках потенциальных опасностей при использовании критического раздела в моем приложении я прочитал несколько ответов в SO, которые вдохновили меня.

Я написал код ниже, рациональность его проста;

  1. Поток работает до тех пор, пока не будет завершен при завершении работы приложения.
  2. Add(request1, request2, host, port) используется для добавления элемента в std::queue.
  3. убедитесь, что между запросами на отправку есть временная задержка
  4. проверяется размер очереди, если размер > 0, выполняется задание
  5. DispatchRequest к TThreadComponent, который создает один поток.
  6. удалить (извлечь) элемент очереди

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

Основное приложение остается отзывчивым, пока работает этот поток.

Мой вопрос в том, может ли кто-нибудь увидеть потенциальные проблемы, на которые я должен обращать внимание.

В отсутствие более конкретного кода, который будет использовать этот поток, я надеюсь, что его достаточно для тех, кто имеет опыт работы с потоками, чтобы определить потенциальные опасности и дать советы по улучшению.

Ваше здоровье

      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);

}

0 ответов

Другие вопросы по тегам