Re: interthread communication
thanks for your response. I think I understand now the part creating
the buffer for the serial port writer.
void CEthSoc::RxData(DATA *ptr, uint size)
{
CByteArray *pData = new CByteArray;
pData->SetSize(sizeof(size));
memcpy(pData->GetData(), &ptr->Data[0], sizeof(size));
//send data to specific serial port
::PostThreadMessage(m_ThreadIDs[ptr->Universe], UWM_SEND_DMX_DATA,
(WPARAM)pData, size);
}
void CSerialWrite::OnSendData(WPARAM wParam, LPARAM lParam)
{
DWORD bytesWritten, EventDWord, RxBytes, TxBytes;
ULONG status;
BOOL waiting = TRUE;
CByteArray * data = (CByteArray *)wParam;
ASSERT(data != NULL);
if(data == NULL)
return; //
while(running)
{
//write data to the serial port
FT_Write(ftHandle, data->GetData(), 1, &bytesWritten);
//waiting for CTS = high
while(waiting)
{
//wait until the packet has been sent by the serial port
WaitForSingleObject(hEvent,INFINITE);
FT_GetStatus(ftHandle,&RxBytes,&TxBytes,&EventDWord);
if (EventDWord & FT_EVENT_MODEM_STATUS)
{
FT_GetModemStatus(ftHandle, &status);
if (status & 0x00000010)
{ // CTS is high
waiting = FALSE;
}
}
}
//-> ready to get the new data pkt
if(no_new_data_pkt) -> tx the last buffer again
else
{
//delete buffer
delete [] data;
//tx new buffer
}
} //end of running while()
//-> stop tx data to serial port
}
The problem: If the first ethernet packet will arrive it will be send
by a pointer to the CByteArray to this function. Now the serial port
writer has to write a continuous data-stream as long as the running
condition is true. That means, if a new ethernet packet will arrive,
then transmit this new packet; if there`s no new ethernet packet, then
transmit the old buffer again (for a specific time). This is the
algorithm to acchieve.
If there`s another PostThreadMessage(UWM_SEND_DMX_DATA) while sending
the last packet to the serial port - how is it possible to get this
message (CSerialWrite::OnSendData)? Immediately after returning the
OnSendData() function (do not using the running condition)? If that`s
right - how is it then possible to start the OnSendData() function
again, if there`s no new ethernet packet received??? Because if
there`s no new ethernet packet, the serial port has to transmit the
last ethernet packet again.
I hope you understand the algorithm.
best regards
Hans