线程分为用户界面线程(UI线程)和工作者线程,UI线程有自己的窗口,而工作者线程通常在后台工作,不能直接接收用户的命令。工作者线程可以通过PostThreadMessage()函数向一个已知ID的线程发消息传递消息,另一个线程通过GetMessage()接收消息。
BOOL PostThreadMessage
(
DWORD idThread, /* 线程的ID */
UINT Msg, /* 需要传递的消息 */
WPARAM wParam, /* 消息的参数 */
LPARAM lParam /* 消息的参数 */
);
在CreateThread()函数中的lpThreadId 参数会设为新线程的ID,把它保存为全局变量,在主程序或其他线程中就可以用PostThreadMessage发送线程消息了。比如:
PostThreadMessage(TargetThreadID, WM_ANYMESSAGE,0,0);
如果目标是有消息循环的线程,就会在GetMessage或peekMessage时得到一个WM_ANYMESSAGE的消息。(注意:PostMessage由于需要一个hWnd参数,对于没有窗口的线程是不适用的。 )
举个例子:
int WINAPI start()
{
. . .
::CreateThread(NULL,0,ThreadProc,0,0,&dwmain);
if (m_port.InitPort(dwmain, mycom, 9600 ))
m_port.StartMonitoring();
/*把数据处理线程的ID号dwmain传递给了串口监视线程*/
. . .
}
这样,dwmain就作为数据处理主线程的ID保存为全局变量,然后传递给串口监视线程,以便串口监视线程在必要时向dwmain线程发送消息。
下面是线程控制函数:
DWORD WINAPI ThreadProc(void* p)
{
MSG msg;
while (::GetMessage(&msg, NULL, 0, 0))
{
switch(msg.message)
{
case WM_COMM_RXCHAR:
. . .
/*在这里完成相应的工作*/
break;
default:
break;
}
}
return 0;
}
void CSerialPort::ReceiveChar(CSerialPort* port, COMSTAT comstat)
{
. . .
::PostThreadMessage(port->m_pOwner,WM_COMM_RXCHAR,(WPARAM)RXBuff, (LPARAM) port->m_nPortNr);
/* 把WM_COMM_RXCHAR消息发送给port->m_pOwner线程 */
. . .
}
这样,就完成了两个工作者线程间的通信。
BOOL PostThreadMessage
(
DWORD idThread, /* 线程的ID */
UINT Msg, /* 需要传递的消息 */
WPARAM wParam, /* 消息的参数 */
LPARAM lParam /* 消息的参数 */
);
在CreateThread()函数中的lpThreadId 参数会设为新线程的ID,把它保存为全局变量,在主程序或其他线程中就可以用PostThreadMessage发送线程消息了。比如:
PostThreadMessage(TargetThreadID, WM_ANYMESSAGE,0,0);
如果目标是有消息循环的线程,就会在GetMessage或peekMessage时得到一个WM_ANYMESSAGE的消息。(注意:PostMessage由于需要一个hWnd参数,对于没有窗口的线程是不适用的。 )
举个例子:
int WINAPI start()
{
. . .
::CreateThread(NULL,0,ThreadProc,0,0,&dwmain);
if (m_port.InitPort(dwmain, mycom, 9600 ))
m_port.StartMonitoring();
/*把数据处理线程的ID号dwmain传递给了串口监视线程*/
. . .
}
这样,dwmain就作为数据处理主线程的ID保存为全局变量,然后传递给串口监视线程,以便串口监视线程在必要时向dwmain线程发送消息。
下面是线程控制函数:
DWORD WINAPI ThreadProc(void* p)
{
MSG msg;
while (::GetMessage(&msg, NULL, 0, 0))
{
switch(msg.message)
{
case WM_COMM_RXCHAR:
. . .
/*在这里完成相应的工作*/
break;
default:
break;
}
}
return 0;
}
void CSerialPort::ReceiveChar(CSerialPort* port, COMSTAT comstat)
{
. . .
::PostThreadMessage(port->m_pOwner,WM_COMM_RXCHAR,(WPARAM)RXBuff, (LPARAM) port->m_nPortNr);
/* 把WM_COMM_RXCHAR消息发送给port->m_pOwner线程 */
. . .
}
这样,就完成了两个工作者线程间的通信。