LabWindows: реализация потоковобезопасных очередей, которые могут обрабатывать строковые элементы
У меня есть сервер Labwindows, который прослушивает данные от клиента Python на удаленной машине. На сервере Labwindows всякий раз, когда вызывается событие TCP_DATAREADY, я считываю буфер для получения данных от клиента. На данный момент мне нужно проанализировать данные и обновить элементы управления пользовательского интерфейса. Однако, поскольку данные поступают часто, лучше, если я смогу поручить задачу анализа данных и обновления элементов управления пользовательским интерфейсом для другого потока, чтобы сервер не потерял данные от клиента.
Я думал об использовании потоковобезопасных очередей в Labwindows. Однако данные, которые я получаю от клиента, являются строкой. Как мне построить очередь, в которой есть строковые элементы? Я не могу использовать указатели, так как данные, полученные от клиента, обновляются каждый раз, когда поступают данные.
Вот фрагмент кода, который читает данные из сокета:
case TCP_DATAREADY:
if ((dataSize = ServerTCPRead (g_hconversation, receiveBuf,
dataSize, 1000))
< 0)
{
SetCtrlVal(g_hconversation, MAINPNL_TEXTBOX,"Receive Error");
}
else
{
//receiveBuff should be passed to function that decides where to display it
display_value_from_client(receiveBuf);
}
Таким образом, receiveBuf постоянно меняется, и сохранение указателей на него в очереди не поможет. Как мне реализовать здесь многопоточность, чтобы мои потоки заботились о функциональности синтаксического анализа, и мне нужно только беспокоиться о чтении данных из сокета в основном потоке?
1 ответ
"Классический" способ выполнения таких межпотоковых коммуникаций состоит в том, чтобы распределить по маске receiveBuf, поставить в очередь указатель буфера после получения данных и немедленно распределить другой буфер приема для следующей загрузки данных. Вы можете освободить указатели буфера после обработки их в графическом интерфейсе.
Такой подход означает, что пользовательский интерфейс и сетевые потоки никогда не работают в одном и том же буфере и поэтому могут работать независимо.