#c #mfc
#c #mfc
Вопрос:
Мне нужно создать поток, используя AfxBeginThread в приложении MFC, которое использует некоторые диалоговые окна, но поскольку функция thread находится внутри класса, я должен сделать ее статичной, и тогда я не смогу использовать какие-либо элементы управления, потому что они не статичны, и даже если я сделаю их статичными, я получу некоторые ошибки компоновщика.
Может кто-нибудь сказать мне, как это правильно реализовать? Действительно ли мне нужно объявлять элементы управления статическими? Или есть какой-либо другой способ сделать это?
Это ошибки (без статических)
error C2228: left of '.AddString' must have class/struct/union
С помощью статического:
unresolved external symbol "public: static class CListBox CsearchDlg::m_musicList" (?m_musicList@CsearchDlg@@2VCListBox@@A)
Ответ №1:
Предполагается, что функция thread должна получать параметр, который вы передаете AfxBeginThread
как pParam
, и вы можете передать туда указатель на свой класс, а из функции thread вызвать любую функцию-член класса, которую вы хотите. Вот как я это делаю.
Что-то вроде этого (псевдокод):
CWinThread* thread = AfxBeginThread(
MyClass::ThreadFunc,
this);
MyClass::ThreadProc(LPARAM pParam)
{
MyClass cls = dynamic_cast<MyClass*>(pParam);
cls->RealThreadFunc();
};
Ответ №2:
Обычно не рекомендуется «трогать» пользовательский интерфейс из вторичных потоков. Лучше оставить все взаимодействие с пользовательским интерфейсом основному потоку и просто отправлять сообщения из вторичного потока в основной.
Комментарии:
1. как вы отправляете сообщение в другой поток? Что мне нужно, так это поиск определенных файлов на компьютере и добавление их в список
2. @vBx Проверьте ссылку . Это охватывает практически все, например, «не прикасаться к графическому интерфейсу», как уведомлять основной графический интерфейс о событиях и т.д.