急救:线程问题! 本帖最后由 stlnkm 于 2010-05-22 00:06:14 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不是退出,我是通过设置bool变量让它退出的。 下面是我的发送线程源码//发送屏幕图像块线程UINT __cdecl CScreenMonitor::SenderThread(LPVOID lpParameter){ //处理线程参数 LPMONITORTHREADPARAM pParam=(LPMONITORTHREADPARAM)lpParameter; CScreenMonitor* pThis=pParam->pThis; SOCKET hSocket=(SOCKET)pParam->dwData; delete pParam; CSocketEx SenderSocket(OnProcessNetMsg); SenderSocket.Attach(hSocket); CHead Head; Head.m_nRowCount=m_ScreenMonitor.m_nMonitorThreadNum; Head.m_nColCount=m_ScreenMonitor.m_nBlockNumPerThread; Head.m_nCXScreen=pThis->m_nCXScreen; Head.m_nCYScreen=pThis->m_nCYScreen; SenderSocket.SendData(&Head); //CSafeBlock* pSendedData=NULL; CBlock* pBlock=NULL; while(!m_ScreenMonitor.m_bEndService) { //if(m_ScreenMonitor.m_lFinishCount==m_ScreenMonitor.m_nMonitorThreadNum) if(::InterlockedExchange(&m_ScreenMonitor.m_lFinishCount,m_ScreenMonitor.m_lFinishCount)==m_ScreenMonitor.m_nMonitorThreadNum) { m_ScreenMonitor.m_lFinishCount=(LONG)0; while(!m_ScreenMonitor.m_pSendedData.IsEmpty()) { //pThis->m_sbListLock.Lock(); pBlock=m_ScreenMonitor.m_pSendedData.RemoveHead(); //pThis->m_sbListLock.Unlock(); if(m_ScreenMonitor.m_pSendedData.IsEmpty())//最后一块 { pBlock->m_bLastBlock=true; } SenderSocket.SendData(pBlock); //::SetEvent(pSendedData->m_hEvent); } BOOL b; for(int i=0;i<m_ScreenMonitor.m_nMonitorThreadNum;++i) { b=::SetEvent(m_ScreenMonitor.m_phThreadEvents[i]); } } Sleep(300); } return 0;}发送的数据量比较多 补充:SenderSocket.SendData(pBlock);的SendData中使用了CSocketFile和CArchive发送数据 感觉很迷茫,在公司编软件的来谈一下,到底怎样编一个真正的软件? MFC 用鼠标画直线 如何将形如\u60c5\u65ad\u68a6\u91cc的字符串转换为汉字? 请教,如何利用抓包工具Ethereal等,用VC编写模拟某客户端(已知用户名密码)登录服务器 怎样从文件中改写特定的字符串? 请高手解释一下模糊色和标准纯色。谢谢。 征求作品 请问FILE 能不能每次从第一行开始写? 请教windows启动屏保的机制?是在driver还是应用层实现的呢? 它之允许我给这些分。不好意思。不过我知道你们回答问题不仅仅是为分的 在DirectX中查找Button, Text Box 文件的大小
不是退出,我是通过设置bool变量让它退出的。
//发送屏幕图像块线程
UINT __cdecl CScreenMonitor::SenderThread(LPVOID lpParameter)
{
//处理线程参数
LPMONITORTHREADPARAM pParam=(LPMONITORTHREADPARAM)lpParameter;
CScreenMonitor* pThis=pParam->pThis;
SOCKET hSocket=(SOCKET)pParam->dwData;
delete pParam; CSocketEx SenderSocket(OnProcessNetMsg);
SenderSocket.Attach(hSocket); CHead Head;
Head.m_nRowCount=m_ScreenMonitor.m_nMonitorThreadNum;
Head.m_nColCount=m_ScreenMonitor.m_nBlockNumPerThread;
Head.m_nCXScreen=pThis->m_nCXScreen;
Head.m_nCYScreen=pThis->m_nCYScreen;
SenderSocket.SendData(&Head); //CSafeBlock* pSendedData=NULL;
CBlock* pBlock=NULL;
while(!m_ScreenMonitor.m_bEndService)
{
//if(m_ScreenMonitor.m_lFinishCount==m_ScreenMonitor.m_nMonitorThreadNum)
if(::InterlockedExchange(&m_ScreenMonitor.m_lFinishCount,m_ScreenMonitor.m_lFinishCount)==m_ScreenMonitor.m_nMonitorThreadNum)
{
m_ScreenMonitor.m_lFinishCount=(LONG)0;
while(!m_ScreenMonitor.m_pSendedData.IsEmpty())
{
//pThis->m_sbListLock.Lock();
pBlock=m_ScreenMonitor.m_pSendedData.RemoveHead();
//pThis->m_sbListLock.Unlock(); if(m_ScreenMonitor.m_pSendedData.IsEmpty())//最后一块
{
pBlock->m_bLastBlock=true;
} SenderSocket.SendData(pBlock); //::SetEvent(pSendedData->m_hEvent);
}
BOOL b;
for(int i=0;i<m_ScreenMonitor.m_nMonitorThreadNum;++i)
{
b=::SetEvent(m_ScreenMonitor.m_phThreadEvents[i]);
}
}
Sleep(300);
}
return 0;
}
发送的数据量比较多