2012-07-27 48 views
0

我回来了一个以此开始的实验项目: 我有一个包含的10000个元素的数组,POINT类型。它们应该是具有x和y坐标的像素,可以在窗口上绘制(SetPixel())。我创建了创建DC,您可以通过阵列的每个点,并绘制在屏幕上简单的功能:Windows中的C++异步功能

void draw_points() { 
    HDC hdc = GetDC(hWnd); 
    for (int i = 0; i < 10000; i++) { 
     SetPixel(hdc, points[i].x, points[i].y, RGB(0, 0, 0)); 
    } 
    ReleaseDC(hWnd, hdc); 
} 

好吧,我把这个功能的WinMain()功能的主循环中。有用。我可以看到屏幕上绘制的点。问题是,在显示点时我无法做其他任何事情,所以我发现我需要异步功能,就像在Java中一样。这是因为我希望能够在draw_points()函数正在运行时添加,删除,修改阵列中的点。

我不需要任何结果,我只是想让它在另一个线程中运行,而我随心所欲地执行其他功能。 所以,我的问题是:Windows API为我提供了什么?通常的做法是什么?我需要一些外部库吗?我只是不知道如何开始。我希望你明白我想要的。谢谢!

回答

1

你不应该在主循环中调用它。相反,当您在窗口消息循环中获得WM_PAINT事件时,应该调用它。

+0

是的,但我不希望它只在调用WM_PAINT时运行,我希望它持续运行 – ali 2012-07-27 12:35:01

+0

@ali在'WM_PAINT'中调用它,并且如果你改变某些点,例如调用[''RedrawWindow'](http://msdn.microsoft.com/en-us/library/windows/desktop/dd162911%28v=vs.85%29.aspx)或['UpdateWindow'](http:// msdn .microsoft.com/en-us/library/windows/desktop/dd145167%28v = vs.85%29.aspx),你将得到一个'WM_PAINT'事件。除非你真的需要,否则不要抽签。 – 2012-07-27 12:37:33

+0

是的,这可能是一个很好的选择。我知道在这种情况下异步线程并不是很常用 – ali 2012-07-27 12:59:28

1

你无法做任何事情的原因是因为你没有回应Windows消息。您应该在循环中放置一个PeekMessage()调用来定期检查消息队列。当你得到一个,你需要调用TranslateMessage()和DispatchMessage()。

+0

我就是这么做的。然而,循环冻结了一点点窗口(10000个元素,想象) – ali 2012-07-27 12:58:46