Создание потоков, работающих с диалоговыми окнами

#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 Проверьте ссылку . Это охватывает практически все, например, «не прикасаться к графическому интерфейсу», как уведомлять основной графический интерфейс о событиях и т.д.