Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
14 / 14 / 8
Регистрация: 26.09.2007
Сообщений: 866
1

Указатель hwnd передать в поток

05.01.2018, 19:53. Показов 752. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
вобщим, как известно в поток надо передавать hwnd главного окна потом делать FromHandle в потоке. я так и делаю и не правильный результат. вот есть код запускает поток и передает в него hwnd. (у меня приложение на базе CDialog)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
HWND hwnd = AfxGetApp()->GetMainWnd()->GetSafeHwnd();  //получаем указатель на главное окно
 
Cthread_hwndDlg *pDlgMy=(Cthread_hwndDlg *)CWnd::FromHandle(hwnd); //для примера восстанавливаем
//при помощи FromHandle
 
//далее для примера получаем указатель на главное окно приложения другим путем
//а не через FromHandle, причем дебаггер студии показывает pDlg == pDlgMy (равны два указателя)
Cthread_hwndDlg *pDlg = this;
 
//передаем в потом параметр hwnd и запускаем поток
pThreadParms = new THREADPARMS;
pThreadParms->hwnd = hwnd;
 
CWinThread* pThread;
pThread = AfxBeginThread(threadFunc1,(THREADPARMS *)pThreadParms,
    THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
 
pThread->m_bAutoDelete = FALSE;
 
pThread->ResumeThread();
 
::WaitForSingleObject(pThread->m_hThread, INFINITE);
тут в этом коде я в дебаггере посмотрел pDlg было равно pDlgMy как я уже указывал. потом в потоке делаю тоже FromHandle (код потока далее).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
UINT __cdecl Cthread_hwndDlg::threadFunc1(LPVOID pParam)
{
 
    THREADPARMS* pThreadParms = (THREADPARMS* )pParam;
    
        //pDlg не равно тому значение которое было до вызова потока в классе
    Cthread_hwndDlg *pDlg=(Cthread_hwndDlg *)CWnd::FromHandle(pThreadParms->hwnd);
 
    pDlg->m_edit_text.SetWindowText("fine");
 
 
    return 0;
}
смотрю дебаггером значение полученное в потоке через функцию FromHandle pDlg по значению не равно тому что было в классе pDlgMy.

фактически что я делаю - беру hwnd и до запуска потока получаю pDlg через вызов FromHandle и после запуска потока беру тот же hwnd уже в потоке и тоже получаю pDlg через вызов FromHandle но уже в потоке - и значение pDlg полученное до запуска потока отличается от того что потом получаем pDlg в потоке. немного запутано но думаю ясно.

если наглядно объяснить - я делаю до запуска потока:
C++
1
    Cthread_hwndDlg *pDlg=(Cthread_hwndDlg *)CWnd::FromHandle(hwnd);
и после запуска потока в самом потоке делаю:
C++
1
    Cthread_hwndDlg *pDlg=(Cthread_hwndDlg *)CWnd::FromHandle(hwnd);
и эти два значения pDlg раз- ны- е !!! то есть я не могу например сделать pDlg->my_edit_control.SetWindowText("hello world!");

как решить проблему с этим указателем на главное окно которое я передаю в поток? например строчка в потоке глючит:

C++
1
    pDlg->m_edit_text.SetWindowText("fine");
то есть не работает. не могу получить доступ к CEdit на диалоге из потока.
заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.01.2018, 19:53
Ответы с готовыми решениями:

Как передать указатель в поток?
Есть GUI прога, в главном классе создаётся объект потока. Вопрос: как передать этому потоку...

Не могу передать указатель в поток
Я пишу простую утилиту для работы с VkAPI. Запрос к серверу осуществляется в отдельном потоке,...

Передать указатель на объект в новый поток
Добрый день. Нужно сделать типо показа времени на компьютере в форме, которое будет обновляться...

Через CreateThread в поток передать указатель на форму или ее элемент
Можно ли через CreateThread в поток передать указатель на форму или ее элемент(VS2010)? ...

0
05.01.2018, 19:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.01.2018, 19:53
Помогаю со студенческими работами здесь

Если в класс нужно передать указатель на указатель на массив строк неизвестной длинны?
Как проинициализировать массив строк wchar_t * (произвольного размера) , если его нужно передать в...

Передать в неуправляемую функцию указатель на указатель
Неуправляемая функция типа FUNC(int ** r); Делаю так fixed (int* ptr = arr) { ...

Как передать HWND параметром через ShellExecute?
Приветствую. Как передать HWND параметром через ShellExexute? Передаю так: HANDLE...

Передать в функцию указатель на указатель
Добрый день, В main я создаю указатель на строку, память для которой хочу выделить внутри другой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru