Actualizar solo el rectángulo del cliente

programación


Hola,

He estado trabajando en una aplicación MFC de subprocesos múltiples que necesita trazar un gráfico en un control de imagen. Todo parece

para funcionar bien, aparte del hecho de que el control de imagen no se vuelve a dibujar al llamar a la función Invalidar para la imagen

control. Toda la ventana se vuelve a dibujar y se produce un parpadeo si llamo a Invalidar en el cuadro de diálogo. ¿Alguna sugerencia sobre dónde puedo

voy mal? Intenté esto pero no ayudó: http://computer-programming-forum.com/82-mfc/1d8b6d604dd7c393.htm

Código:

C++
DWORD WINAPI CDlg::WorkerThread(LPVOID lpVoid)
{
CDlg* appPtr = (CDlg*)lpVoid;
CStatic* pStatic = (CStatic*)appPtr->GetDlgItem(IDC_GRAPH_WINDOW);

while(true)
{
// Plotting graph
// Requires Update
appPtr->UpdatePoints(i);
pStatic->PostMessage(WM_PAINT);
}
}

Solución 1

Creo que el problema es el acceso a la GUI desde el hilo de trabajo. Eche un vistazo a este artículo para ver cómo hacerlo de la manera correcta: Usando hilos de trabajo[^]

Worker threads and the GUI II: Don't touch the GUI

That's right. A worker thread must not touch a GUI object. This means that you should not query the state of a control, add something to a list box, set the state of a control, etc.

Why?

Because you can get into a serious deadlock situation. A classic example was posted on one of the discussion boards, and it described something that had happened to me last year. The situation is this: you start a thread, and then decide to wait for the thread to complete. Meanwhile, the thread does something apparently innocuous, such as add something to a list box, or, in the example that was posted, calls FindWindow. In both cases, the process came to a screeching halt, as all threads deadlocked.

Solución 3

http://Www.hotboat.com/frm/member.php?u=12894

コメント

タイトルとURLをコピーしました