使用线程的gdi绘画[英] gdi painting using Threading

问题描述

在我的应用程序中,我需要在视频上连续绘制一些形状.
我已经使用直接显示进行视频播放和用于绘制形状的 gdi

现在假设我使用了以下函数来绘制形状


void  threadPaint( void * )
{
	WINDOWPLACEMENT lpwndpl_v1;   
	GetWindowPlacement(hw,&lpwndpl_v1); // hw is handler to picture box control (used for video playback) 

	HDC hdc;
	hdc = BeginPaint(hw, &ps);                
	Graphics graphics(hw);      
	Pen  pen3(Color(255, 0,0,255),10);
	while(threadAna) /////////
	 {
      graphics.DrawLine(&pen3,lpwndpl_v1.rcNormalPosition.left+40,lpwndpl_v1.rcNormalPosition.top+90,lpwndpl_v1.rcNormalPosition.right,lpwndpl_v1.rcNormalPosition.top+90);
     }
EndPaint(hw, &ps);  
}



我使用
调用这个线程
threadAna=1;
_beginthread( threadPaint, 0, (void*)12 );
Sleep(20);

在我的应用程序中,我使用了函数 SetWindowPos() &ShowWindow() 在各个地方.

例如在 WM_MOUSEMOVE

::SetWindowPos(GetDlgItem(g_hDialogWindow, IDC_MODE_TEXT), HWND_TOPMOST,  lpwndpl_home.rcNormalPosition.left+9,  lpwndpl_home.rcNormalPosition.bottom, 55,18,   SWP_NOZORDER );      

SetWindowText(GetDlgItem(g_hDialogWindow, IDC_MODE_TEXT), "HOME");
ShowWindow(GetDlgItem(g_hDialogWindow, IDC_MODE_TEXT), TRUE);


现在我的问题是,每当我移动鼠标或按下我使用 SetWindowPos() & 的某个按钮时ShowWindow() 整个窗口都受到影响(我认为它以不寻常的方式更新).

如果我没有使用线程那么应用程序运行良好..

推荐答案

尝试使用以下原则:

仅在 UI 线程中进行所有渲染,但渲染结果将取决于某些数据,并且数据应在线程之间共享,并使用临界区互锁.更好的是,使用 multiple reader/single-writer lock,它在 Windows、boost 等中可用:
http://en.wikipedia.org/wiki/Readers%E2%80%93writer_lock[^],
另请参阅此 CodeProject 文章:Ultra-simple C++ Read/为 Windows 编写锁类[^].

在多读者锁的情况下,写者是一个修改数据的非UI线程.

当数据被修改时,通过调用 Invalidate 函数之一触发发送 WM_PAINT Windows 消息:
http://msdn.microsoft.com/en-us/library/ax04k970%28v=vs.71%29.aspx[^],
http://msdn.microsoft.com/en-us/library/dd145002%28v=vs.85%29.aspx[^],
http://msdn.microsoft.com/en-us/library/2f3csed3%28v=vs.80%29.aspx[^],
http://msdn.microsoft.com/en-us/library/dd145003%28v=vs.85%29.aspx[^],
http://msdn.microsoft.com/en-us/library/532h978c%28v=vs.80%29.aspx[^].

您可以通过仅重新绘制场景的一部分来使矩形或区域无效以获得一些性能.

另请参阅:http://msdn.microsoft.com/en-us/library/dd162759%28v=vs.85%29.aspx[^].

—SA

本文地址:https://www.itbaoku.cn/post/1395019.html