Быстрое и грязное решение Win32 будет включать критическую секцию, текстовый буфер и таймер в потоке пользовательского интерфейса.
Определите несколько глобалов ...
CRITICAL_SECTION bufferLock; // critical section (to be initialized somewhere)
char dataBuffer[65536]; // contains the data that will be sent to the form
int newdata = 0; // how much data we got (this variable must be atomic, int is ok)
char uiDataBuffer[65536]; // data available to the form
int overflow = 0; // just in case...
Таймер пользовательского интерфейса
void onTimer ()
{
if (overflow)
{
// handle this
}
else
if (newdata) // new data to display
{
// take the lock, copy the data and release the lock quickly
EnterCriticalSection(&bufferLock);
int dataread = newdata;
memcpy(uiDataBuffer, dataBuffer, dataread);
newdata = 0;
LeaveCriticalSection(&bufferLock);
// TODO: append the text in uiDataBuffer[] to your text control
}
}
Для вызова из рабочего потока:
void sendData (char* data, int size)
{
EnterCriticalSection (&bufferLock);
if(size+newdata > 65536)
overflow = 1;
else
{
memcpy(dataBuffer+newdata, data, size);
newdata += size;
}
LeaveCriticalSection (&bufferLock);
}
Код не проверен. Размер буфера и частота таймера должны быть скорректированы.
Можно избежать опроса буфера с таймером, используя PostMessage () (с пользовательским сообщением), чтобы сигнализировать пользовательскому интерфейсу о доступности новых данных.
Если производительность является проблемой, обмен данными между производителем и потребительским потоком также может быть очень эффективно выполнен с помощью очереди FIFO без блокировки.
Только PostMessage () не является решением для обмена данными между потоками.