m_pReader = new CWorker();
m_pWriter = new CWorker();
m_pReader->moveToThread(m_pReaderThread);
m_pWriter->moveToThread(m_pWriterThread);
connect(m_pReaderThread, SIGNAL(started()), m_pReader, SLOT(doReadData()));
connect(m_pReader, SIGNAL(finishedWork()), m_pReaderThread, SLOT(quit()));
connect(m_pReader, SIGNAL(finishedWork()), m_pReader, SLOT(deleteLater()));
connect(m_pReaderThread, SIGNAL(finished()), m_pReaderThread, SLOT(deleteLater()));
connect(m_pWriterThread, SIGNAL(started()), m_pWriter, SLOT(doWriteData()));
connect(m_pWriter, SIGNAL(finishedWork()), m_pWriterThread, SLOT(quit()));
connect(m_pWriter, SIGNAL(finishedWork()), m_pWriter, SLOT(deleteLater()));
connect(m_pWriterThread, SIGNAL(finished()), m_pWriterThread, SLOT(deleteLater()));
connect(m_pSampleUi->btnStartStop, SIGNAL(clicked()), this, SLOT(sltToggleButton()));
m_pReaderThread->start();
m_pWriterThread->start();
m_pReaderThread = new QThread;
m_pReader = new CWorker();
m_pWriterThread = new QThread;
m_pWriter = new CWorker();
m_pReader->moveToThread(m_pReaderThread);
m_pWriter->moveToThread(m_pWriterThread);
connect(m_pReaderThread, SIGNAL(started()), m_pReader, SLOT(doReadData()));
connect(m_pReader, SIGNAL(finishedWork()), m_pReaderThread, SLOT(quit()));
connect(m_pReader, SIGNAL(finishedWork()), m_pReader, SLOT(deleteLater()));
connect(m_pReaderThread, SIGNAL(finished()), m_pReaderThread, SLOT(deleteLater()));
connect(m_pWriterThread, SIGNAL(started()), m_pWriter, SLOT(doWriteData()));
connect(m_pWriter, SIGNAL(finishedWork()), m_pWriterThread, SLOT(quit()));
connect(m_pWriter, SIGNAL(finishedWork()), m_pWriter, SLOT(deleteLater()));
connect(m_pWriterThread, SIGNAL(finished()), m_pWriterThread, SLOT(deleteLater()));
connect(m_pSampleUi->btnStartStop, SIGNAL(clicked()), this, SLOT(sltToggleButton()));
m_pReaderThread->start();
m_pWriterThread->start();
To copy to clipboard, switch view to plain text mode
void CWorker::doReadData()
{
char szBuffer[BUFFER_SIZE];
DWORD cbBytes;
bool bResult = false;
ConnectNamedPipe(CWorker::m_shPipeHandle, NULL);
do {
//Read client message
bResult = ReadFile(
m_shPipeHandle, // handle to pipe
szBuffer, // buffer to receive data
BUFFER_SIZE, // size of buffer
&cbBytes, // number of bytes read
NULL); // not overlapped I/O
if ((!bResult) || (!cbBytes))
{
qDebug()<<"\nError occurred while reading from the client:"<<GetLastError();
// TODO: Action to be taken on failure
}
else
{
qDebug()<<"Client sent following message:"<<szBuffer;
// Inform the Main UI thread to update UI elements or to do necessary action.
emit dataAvailable
(QString(szBuffer
).
toInt());
// Update the shared m_enumCmd so that Writer thread can write the Acknowledgement in NamedPipe so that "ApplicationB" can read & process it.
m_Mutex.lock();
m_enumCmd = COMMAND_ACK_READ;
m_Mutex.unlock();
// Release the semaphore so that writer thread can acquire and starts writing the data (ACK) onto the pipe.
m_Sem.release();
}
} while(m_bReadThreadControl);
}
void CWorker::doReadData()
{
char szBuffer[BUFFER_SIZE];
DWORD cbBytes;
bool bResult = false;
ConnectNamedPipe(CWorker::m_shPipeHandle, NULL);
do {
//Read client message
bResult = ReadFile(
m_shPipeHandle, // handle to pipe
szBuffer, // buffer to receive data
BUFFER_SIZE, // size of buffer
&cbBytes, // number of bytes read
NULL); // not overlapped I/O
if ((!bResult) || (!cbBytes))
{
qDebug()<<"\nError occurred while reading from the client:"<<GetLastError();
// TODO: Action to be taken on failure
}
else
{
qDebug()<<"Client sent following message:"<<szBuffer;
// Inform the Main UI thread to update UI elements or to do necessary action.
emit dataAvailable(QString(szBuffer).toInt());
// Update the shared m_enumCmd so that Writer thread can write the Acknowledgement in NamedPipe so that "ApplicationB" can read & process it.
m_Mutex.lock();
m_enumCmd = COMMAND_ACK_READ;
m_Mutex.unlock();
// Release the semaphore so that writer thread can acquire and starts writing the data (ACK) onto the pipe.
m_Sem.release();
}
} while(m_bReadThreadControl);
}
To copy to clipboard, switch view to plain text mode
void CWorker::doWriteData()
{
DWORD cbBytes;
bool bResult = false;
char szBuffer[BUFFER_SIZE];
do
{
m_Sem.acquire();
qDebug()<<"\nInside the Write Loop\n";
switch(m_enumCmd)
{
case COMMAND_PAUSE_SERVICE:
sprintf(szBuffer, "%d", COMMAND_PAUSE_SERVICE);
break;
case COMMAND_RESUME_SERVICE:
sprintf(szBuffer, "%d", COMMAND_RESUME_SERVICE);
break;
case COMMAND_ACK_READ:
sprintf(szBuffer, "%d", COMMAND_ACK_READ);
break;
case COMMAND_UNKNOWN:
default:
szBuffer[0] = '\0';
break;
}
bResult = WriteFile(
m_shPipeHandle, // handle to pipe
szBuffer, // buffer to write from
strlen(szBuffer) + 1, // number of bytes to write, include the NULL
&cbBytes, // number of bytes written
NULL);
if ((!bResult) || (!cbBytes))
{
qDebug()<<"\nError occurred while writing to the client:"<<GetLastError();
// TODO: Action to be taken on failure
}
else
{
qDebug()<<"Written data is: "<<szBuffer;
}
} while (m_bWriteThreadControl);
}
void CWorker::doWriteData()
{
DWORD cbBytes;
bool bResult = false;
char szBuffer[BUFFER_SIZE];
do
{
m_Sem.acquire();
qDebug()<<"\nInside the Write Loop\n";
switch(m_enumCmd)
{
case COMMAND_PAUSE_SERVICE:
sprintf(szBuffer, "%d", COMMAND_PAUSE_SERVICE);
break;
case COMMAND_RESUME_SERVICE:
sprintf(szBuffer, "%d", COMMAND_RESUME_SERVICE);
break;
case COMMAND_ACK_READ:
sprintf(szBuffer, "%d", COMMAND_ACK_READ);
break;
case COMMAND_UNKNOWN:
default:
szBuffer[0] = '\0';
break;
}
bResult = WriteFile(
m_shPipeHandle, // handle to pipe
szBuffer, // buffer to write from
strlen(szBuffer) + 1, // number of bytes to write, include the NULL
&cbBytes, // number of bytes written
NULL);
if ((!bResult) || (!cbBytes))
{
qDebug()<<"\nError occurred while writing to the client:"<<GetLastError();
// TODO: Action to be taken on failure
}
else
{
qDebug()<<"Written data is: "<<szBuffer;
}
} while (m_bWriteThreadControl);
}
To copy to clipboard, switch view to plain text mode
Bookmarks