Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > глобальная ф-ия


Автор: xTr1m 12.11.2005, 18:09
Такой вопрос. Вот у меня есть глобальная функция, с которой работает рабочий поток. Как мне из этой функции обращаться к элементам моей формы. Окно CFrameWnd, в нем есть кнопка. Как мне изменить название кнопки из этой глобальной функции?

P.S. Кстати, я пробывал ф-ию AfxGetMainWnd() , но в ее свойствах кнопки не было.
А главное окно создается так
Код

BOOL CMyApp::InitInstance ()
{
    m_pMainWnd = new CMyFrame();
    ASSERT(m_pMainWnd);    
    m_pMainWnd->ShowWindow(SW_SHOW);
    m_pMainWnd->UpdateWindow();    
    return TRUE;
}

Автор: AlexPro 12.11.2005, 19:10
Код стандартной инициализации ничего не дает для понимания твоей проблемы. Лучше покажи, чего ты там делал со своей кнопкой. smile

Автор: En_t_end 12.11.2005, 19:44
Не знаю, как по стандарту программирования на MFC, но я в таких случаях обьявляю static или даже extern обьект класса нужного контролла. Конечно это довольно вандально по отношению к общему хорошему стилю, но оттучиться уже не могу smile

Автор: nikf 12.11.2005, 20:39
Цитата(xTr1m @ 12.11.2005, 18:09)
Вот у меня есть глобальная функция

делаешь ее
Цитата(En_t_end @ 12.11.2005, 19:44)
static
членом класса, а в пареметр пакуешь указатель на конкретный экземпляр. в функции его распаковываешь и обрабатываешь конкретную форму(из басика чтоли или билдера? "форма" smile )

Автор: AlexPro 13.11.2005, 03:51
Цитата(En_t_end @ 12.11.2005, 19:44)
это довольно вандально по отношению к общему хорошему стилю

Вот-вот! smile Все более или менее авторитетные издания категорически советуют избегать всяческой глобальности, что разумно: при достаточно крупном проекте могут быть не только конфликты имен - не хватит слов, чтобы обозвать все контролы. smile Что же касается тех слов, которые скажут тебе (о тебе) другие программисты, которых посадят править твой проект - то тут напротив, никакого недостатка в словах ощущаться не будет. smile
Касательно вопроса, то тут следует сделать кнопку членом класса окна, как советует nikf, static не нужно, а дальше - передаешь указатель на окно в свою функцию (если менять кнопку всенепременно нужно из этой функции) и через этот указатель вытаскиваешь свою кнопку. Хотя правильнее было бы (если уж зашел разговор о чистоте языка smile ) послать окну сообщение, чтоб оно само разбиралось со своими контролами. smile

Автор: nikf 13.11.2005, 19:01
Цитата(AlexPro @ 13.11.2005, 03:51)
тут следует сделать кнопку членом класса окна

она по любому будет членом класса если пользоваться визардом,
Цитата(AlexPro @ 13.11.2005, 03:51)
static не нужно
smile как ты запихнешь в рабочий поток функцию-член которая не static?

Цитата(AlexPro @ 13.11.2005, 03:51)
а дальше - передаешь указатель на окно в свою функцию (если менять кнопку всенепременно нужно из этой функции) и через этот указатель вытаскиваешь свою кнопку.
- абсолютный повтор предыдущего топа, только не со STATIC! Мы же не хотим чтобы она была глобальной, значит мы ограничиваем ее видимость и делаем ее static, т.е. доступной только через класс. А по сути stasic- это те же глобальные функции, только с ограниченной видимостью, и имеющие доступ к private членам класса. Поэтому они предпочтительнее.

Цитата(AlexPro @ 13.11.2005, 03:51)
Хотя правильнее было бы (если уж зашел разговор о чистоте языка smile ) послать окну сообщение, чтоб оно само разбиралось со своими контролами. smile
- мелкомягкие и чистота языка-две большие разницы, не в тему короче..

Автор: AlexPro 14.11.2005, 05:58
Цитата(nikf @ 13.11.2005, 19:01)
как ты запихнешь в рабочий поток функцию-член которая не static


Видимо я чего-то недопонимаю? smile Поправьте, если что не так. Есть окно в основном потоке приложения. Есть рабочий поток, из которого необходимо получить доступ к элементам управления этого окна. Так? Если да, то в одной из своих программ я использовал примерно следующее (адаптировано для примера):
Код

unsigned __stdcall BrakeThread(void* pvoid)
{
    // Передаем указатель на нужное нам окно через pvoid
    // Если есть глобальный указатель на окно - лучше истользовать его
    CMyDlg* pMyDlg = (CMyDlg*)pvoid;
    while(used>0)    // какое-то условие завершения потока
    {
        // Какой-то код
        // ...
        pMyDlg->m_cMyButton.SetWindowText(_T("My text"));
        // Делаем все что нужно с другими контролами и самим окном
        // ...

    }
    _endthreadex(0);
    return 0;
}


Автор: threef 14.11.2005, 18:47
Попробуй передать информацию через механизм сообщений. Лучше использовать описатель окна, чем класс CWnd, потому что MainFrame у тебя локальная, а потоки имеют различные стеки, могет конфликтовать по адресному пространству.


Код

const isleep = 500;
UINT threadproc(void *p)
{
   HWND hwnd=(HWND)p;
   CString hello="ello";
   while ( SendMessage(hwnd,WM_SETTEXT,0,(LPARAM)(LPCSTR)hello) )
   {
      Sleep(isleep);
   }
   
}

Автор: nikf 14.11.2005, 19:10
Цитата(AlexPro @ 14.11.2005, 05:58)
Видимо я чего-то недопонимаю? smile Поправьте, если что не так.

Цитата
Код

unsigned __stdcall BrakeThread(void* pvoid)
{
    // Передаем указатель на нужное нам окно через pvoid
    // Если есть глобальный указатель на окно - лучше истользовать его

Читаем внимательно:
Цитата(nikf @ 13.11.2005, 19:01)
как ты запихнешь в рабочий поток функцию-член которая не static?

повторяю: функция-член класса. Теперь читаем вопрос от xTr1m:
Цитата(xTr1m @ 12.11.2005, 18:09)
Вот у меня есть глобальная функция, с которой работает рабочий поток. Как мне из этой функции обращаться к элементам моей формы.
Простейший вариант сделать функцию-член класса "формы" и в ней воздействовать на контролы находящиеся на этой "форме". А ты опять предлагаешь глобальную функцию smile. Твой вариант тоже вариант, но он работает с открытыми переменными класса и вообще глобализация это уже не объектный подход и наверно не очень хорошо для крупного проекта, поэтому такие функции лучше делать статик членами класса. Можно также пользоваться сообшениями, но чисто кода получится больше..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)