تحديث مستطيل العميل فقط


مرحبًا،

لقد كنت أعمل على تطبيق MFC متعدد الخيوط الذي يحتاج إلى رسم رسم بياني على عنصر تحكم الصورة. يبدو كل شيء

للعمل بشكل جيد بصرف النظر عن حقيقة عدم إعادة رسم عنصر تحكم الصورة عند استدعاء وظيفة إبطال الصورة

يتحكم. يتم إعادة رسم النافذة بأكملها ويحدث وميض إذا قمت باستدعاء Invalidate في مربع الحوار. أي اقتراحات بشأن أين أنا

هل انا على خطأ؟ لقد جربت هذا لكنه لم يساعد: http://computer-programming-forum.com/82-mfc/1d8b6d604dd7c393.htm

شفرة:

سي ++
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);
}
}

الحل 1

أعتقد أن المشكلة تكمن في الوصول إلى واجهة المستخدم الرسومية من مؤشر ترابط العامل. قم بإلقاء نظرة على هذه المقالة لمعرفة كيفية القيام بالطريقة الصحيحة: استخدام مؤشرات الترابط العاملة[^]

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.

الحل 3

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

コメント

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