none
我在子线程中使用sendmessage向主对话框发送消息告诉主对话框进行界面绘制 RRS feed

  • 问题

  • 我在子线程中使用sendmessage向主对话框发送消息告诉主对话框进行界面绘制,程序运行越来越。我不知道这个是怎么回事。程序的结构首先是采集线程CollectUsbDataForADSThread进行数据采集,然后通知计算线程CalculateThread计算采集到的数据,然后在计算线程中发送消息给主对话框进行界面绘制,程序运行越来越慢,找不到原因.
    UINT CEEG_ONLINEDlg::CollectUsbDataFowADSThread(LPVOID pParam)
    {
    	CEEG_ONLINEDlg *p_ADSCollect = (CEEG_ONLINEDlg*)pParam;					//p_Collect用于访问类的非静态成员;
    	while(TRUE/*p_Collect->m_IsCollectAndProcess*/)
    	{
     		WaitForSingleObject(g_hEventForCollect, INFINITE);							//只有事件对象处于发信状态时该函数才返回,然后执行被保护的代码,该函数一旦返回则事件对象处于未发信状态;
    		if(bThreadControl)
    		{
    			bool IsDataColOk = false;										//IsDataColOk用于表示数据采集是否成功;
    			bAllocMem = FALSE;												//堆内存未分配;
    			PUCHAR pCollectData = new UCHAR[BufferSize];					//采集到的数据是以1个字节为大小;
    			
    			int pDataBuffer[BufferLenth] = {0};
    
    			bAllocMem = TRUE;												//表示堆内存已分配好;
    			if(pCollectData && pDataBuffer)
    			{
    				ZeroMemory(pCollectData, BufferSize);						//清空存放原始数据缓冲区;
    				ZeroMemory(pDataBuffer, BufferLenth);						//清空存放拼接后的数据缓冲区;
    				IsDataColOk = Enpt->XferData(pCollectData, BufferSize);		//将USB传给PC的1024字节数据存入pCollectData指向的内存中;
    			}
    			if(IsDataColOk)													//判断数据采集是否成功;
    			{
    				unsigned int index = 0;										//index为拼接后的数据下标索引;
    				unsigned int j = 0;											
    				for(; index != ArrSize; ++index)							//以下代码为数据拼接方法;
    				{
    					pDataBuffer[index] = pCollectData[j]; 
    					++j;
    					pDataBuffer[index] = pDataBuffer[index] | (pCollectData[j] << 8);
    					++j;
    					pDataBuffer[index] = pDataBuffer[index] | (pCollectData[j] << 16);
    					j = j + 2;
    					ivec.push_back(pDataBuffer[index]);
    				}
    			}
    
    			int a[24];
    			int k = 0;
    			for (vector<int>::iterator it = ivec.begin(); it != ivec.end(); ++it)
    			{
    				*it = p_ADSCollect->ConvertValue(*it, a) /*/ p_ADSCollect->m_YChange*/;
    			}
    			//将数据转换为double型;
    			for (int i = 0; i != ArrSize; ++i)
    			{
    				data[i] = fac * (double)(ivec[i]);
    			}
    
    			double maxf = 8388608 * 0.0153 * 2;//32800;//0.153* (float)(1280000-88388608); 8388607
    			double minf = -8388607 * 0.0153 * 2;//-32800;//0.153* (float)(-1280000-88388608);
    			double max = 10000;
    			double min = -10000;
    			double base = maxf - (maxf - minf) / 4;
    			double factor = (max - min) / (maxf - minf);
    
    			for (int i = 0; i != ArrSize; ++i)
    			{
    				m_pBuffer[i] = (short)((data[i] - base) * factor);
    			}
    
    			//防止内存泄露或者产生内存碎片;
    			delete [] pCollectData;
    			pCollectData = nullptr;
    
    			if (p_ADSCollect->m_SetEvent == 0)
    			{
    				::SetEvent(g_hEventForDrawCurve);									//设置事件对象为有信号状态,通知数据处理线程开始工作;
    			}
    			else if (p_ADSCollect->m_SetEvent == 1)
    			{
    				::SetEvent(g_hEventForCalculate);
    			}
    		}
    		else
    		{
    			//SetEvent(g_hEventForDrawCurve);
    			break;
    		}
    	}
    	return 0;
    }
    //计算线程
    UINT CEEG_ONLINEDlg::CalculateThread(LPVOID pParam)
    {
    	CEEG_ONLINEDlg *p_Calculate = (CEEG_ONLINEDlg*)pParam;	//p_Calculate可以调用类中的成员函数;
    
    	while (TRUE)
    	{
    		WaitForSingleObject(g_hEventForCalculate, INFINITE);
    		if (bThreadControl)
    		{
    			memcpy(p_Calculate->pCalculateBuffer, m_pBuffer, sizeof(short) * nChannelNum * NPT_PER_READ);	//将采集到的数据复制到计算线程的临时存储区;
    			p_Calculate->Calculate();
    			
    			::PostMessage(AfxGetApp()->m_pMainWnd->m_hWnd, WM_MYMESSAGE, 0, 0);
    	
    			//SetEvent(g_hEventForCollect);
    		}
    		else
    		{
    			break;
    		}
    	}
    	return 0;
    }
    /************************************************************************/
    /*						自定义消息相应函数                              */
    /************************************************************************/
    LRESULT CEEG_ONLINEDlg::OnMyMessageProcess(WPARAM wParam, LPARAM lParam)
    {
    	/*CTchart1 achart;
    	CRect arect(20, 20, 400, 400);
    	achart.Create(NULL, NULL, WS_VISIBLE | WS_CHILD, arect, this, 1111);*/
    	++m_test;
    	
    	CSeries series1 = ((CSeries)(m_chart).Series(0));
    	series1.Clear();
    	EnterCriticalSection(&g_CsForCalculate);
    	for (int i = 0; i != len; ++i)
    	{
    		series1.AddXY(i * pwScale, ampR[1][i], NULL, RGB(255, 0, 0));
    	}
    	LeaveCriticalSection(&g_CsForCalculate); 
    
    	//UpdateData(FALSE);
    	SetEvent(g_hEventForCollect);
    	return 0;
    }
    



    • 已编辑 caesar_L 2015年4月29日 2:34
    2015年4月29日 2:31

全部回复

  • 您指的程序运行的越来越慢是指的什么?界面卡顿还是采集数据的效率变低?还是指的什么?能否清楚描述一下?

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2015年4月29日 14:05
    版主
  • 界面会卡顿,线程也会执行的越来越慢
    2015年4月30日 4:33
  • 界面会卡顿,线程也会执行的越来越慢
    2015年5月4日 0:58