Поиск:

Ответ в темуСоздание новой темы Создание опроса
> глобальная ф-ия 
:(
    Опции темы
xTr1m
Дата 12.11.2005, 18:09 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



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

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

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

PM MAIL WWW ICQ   Вверх
AlexPro
Дата 12.11.2005, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 9.11.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 4



Код стандартной инициализации ничего не дает для понимания твоей проблемы. Лучше покажи, чего ты там делал со своей кнопкой. smile
PM MAIL   Вверх
En_t_end
Дата 12.11.2005, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 2
Всего: 20



Не знаю, как по стандарту программирования на MFC, но я в таких случаях обьявляю static или даже extern обьект класса нужного контролла. Конечно это довольно вандально по отношению к общему хорошему стилю, но оттучиться уже не могу smile
PM MAIL ICQ Skype GTalk Jabber   Вверх
nikf
Дата 12.11.2005, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 6.6.2005
Где: город-герой Жирно вск

Репутация: 1
Всего: 1



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

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

Это сообщение отредактировал(а) nikf - 12.11.2005, 20:40
PM MAIL   Вверх
AlexPro
Дата 13.11.2005, 03:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 9.11.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 4



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

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 6.6.2005
Где: город-герой Жирно вск

Репутация: 1
Всего: 1



Цитата(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
- мелкомягкие и чистота языка-две большие разницы, не в тему короче..

Это сообщение отредактировал(а) nikf - 13.11.2005, 19:55
PM MAIL   Вверх
AlexPro
Дата 14.11.2005, 05:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 9.11.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 4



Цитата(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;
}


PM MAIL   Вверх
threef
Дата 14.11.2005, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 1
Всего: 10



Попробуй передать информацию через механизм сообщений. Лучше использовать описатель окна, чем класс 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);
   }
   
}


Это сообщение отредактировал(а) threef - 14.11.2005, 18:48
PM MAIL   Вверх
nikf
Дата 14.11.2005, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 6.6.2005
Где: город-герой Жирно вск

Репутация: 1
Всего: 1



Цитата(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. Твой вариант тоже вариант, но он работает с открытыми переменными класса и вообще глобализация это уже не объектный подход и наверно не очень хорошо для крупного проекта, поэтому такие функции лучше делать статик членами класса. Можно также пользоваться сообшениями, но чисто кода получится больше..

Это сообщение отредактировал(а) nikf - 14.11.2005, 19:11
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1677 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.