Multithreading 如何在工作线程内外使用GetDlgItemText

Multithreading 如何在工作线程内外使用GetDlgItemText,multithreading,mfc,gettext,Multithreading,Mfc,Gettext,我在工作线程中使用GetDlgetteMText时遇到问题。它在外面用起来非常好 TCHAR txtbuff[50]; GetDlgItemText(IDC_SLIDER1, txtbuff, 50); SOmething = ::SendMessage(something,WM_SETTEXT,0,(LPARAM)txtbuff) 但是当我尝试在工作线程中使用相同的方法时,我被告知它不需要3个参数,因为它需要它的HWND句柄(根据我收集的数据),我认为这是使用winspy++或类似方法获得的

我在工作线程中使用GetDlgetteMText时遇到问题。它在外面用起来非常好

TCHAR txtbuff[50];
GetDlgItemText(IDC_SLIDER1, txtbuff, 50);
SOmething = ::SendMessage(something,WM_SETTEXT,0,(LPARAM)txtbuff)

但是当我尝试在工作线程中使用相同的方法时,我被告知它不需要3个参数,因为它需要它的HWND句柄(根据我收集的数据),我认为这是使用winspy++或类似方法获得的,但是这些句柄一直在变化。我认为(因为我是新手,所以我的想法是错误的)我可以简单地在我的工作线程中使用相同的代码。为什么上面的代码在工作线程之外可以正常工作?我环顾了所有地方,是否遗漏了一些明显/简单的东西?

只需要3个参数的GetDlgItemText版本是一个CWnd成员函数。MFC使用CWnd的m_hWnd成员将其转换为4参数API版本。因此,不能在CWnd对象之外使用3参数版本

另一个问题是,两个版本的GetDlgItemText都定义为仅用于访问子窗口。因此,除非在IDC_SLIDER1控件的父窗口上下文中调用,否则无法使用它们

另一个问题是MFC不支持从未创建窗口的线程访问窗口/控件。在一些有限的情况下,这是可行的,但这是一种糟糕的做法。即使在工作时,它也会导致线程之间不明显的交互,可能导致死锁


将与GUI的所有交互放在主线程中。并将您与子窗口(即控件)的所有交互放在父窗口类中。

尽管我可以给您一个答案,但我认为只有创建窗口的线程才应该与之交互。从工作线程调用
GetDlgItemText
是个坏主意。编译问题与线程无关。在主线程中调用
CWnd::GetDlgItemText
函数,因为这是在CWnd派生类方法中完成的。线程函数是静态的或全局的,并调用
GetDlgItemText
API,这需要HWND。使用线程参数将HWND传递给线程。不是MFC缺少对跨线程窗口操作的支持,而是系统内置的窗口管理器。