Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
justanotheruser
0 / 0 / 0
Регистрация: 21.06.2009
Сообщений: 6
#1

OnTimer и второй поток - C++

11.07.2009, 17:24. Просмотров 1835. Ответов 6
Метки нет (Все метки)

добрый день. у меня возникла следующая проблема.
в обработчике таймера я вывожу время и срабатывает всё это дело каждую секунду.
но в случае если мне нужно создать второй диалог скажем для настройки того же времени то после вызова DoModal для второго диалога програмка виснет.
т.е. я понимаю что не могу продолжить работать с диалог1 пока не закрою диалог2. но перейти к диалог2 не могу т.к. каждую секунду срабатывает таймер и делает активным диалог1.
я так понимаю что для решения этой задачи нужен второй поток. но с потоками я не дружен.
Подскажите пожалуйста варианты решения.
C++
1
2
3
4
5
6
7
8
9
10
void CN2Dlg::OnTimer(UINT nIDEvent) 
{
    CTime t=CTime::GetCurrentTime();
    CString time;
    time=t.Format("%H:%M:%S");
    
    m_time_now.SetWindowText(time);
    
    CDialog::OnTimer(nIDEvent);
}
заранее благодарен)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2009, 17:24     OnTimer и второй поток
Посмотрите здесь:

C++ Данные в поток
Поток cin C++
STL и поток C++
Поток stdin C++
C++ Указатель на поток
console win32 ontimer C++
C++ Поток с GetMessage
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
11.07.2009, 18:00     OnTimer и второй поток #2
немного не так.
можешь сделать первый диалог не модальным.
или, в этой функции OnTimer проверяй кто является окном верхнего уровня,
и если верхнее !=this, то вывод времени не делаешь.
и все.
никаких вторых потоков.
justanotheruser
0 / 0 / 0
Регистрация: 21.06.2009
Сообщений: 6
11.07.2009, 18:08  [ТС]     OnTimer и второй поток #3
Patch, спасибо. эм.. можно функцию для проверки которое из окон является окном верхнего уровня?(я многого не знаю. по-этому, собственно и в разделе Для начинающих )

ну раз уж я так ошибся со вторым потоком, может быть кто-нибудь подскажет как реализовать решение с его помощью? а то тема получилась совсем не по теме (извините за каламбур)
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
12.07.2009, 08:22     OnTimer и второй поток #4
Цитата Сообщение от justanotheruser Посмотреть сообщение
можно функцию для проверки которое из окон является окном верхнего уровня
можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void CN2Dlg::OnTimer(UINT nIDEvent) 
{
if(GetTopWindow() == this->m_hwnd)
{
        CTime t=CTime::GetCurrentTime();
        CString time;
        time=t.Format("%H:%M:%S");
        
        m_time_now.SetWindowText(time);
}        
        CDialog::OnTimer(nIDEvent);
}
Цитата Сообщение от justanotheruser Посмотреть сообщение
ну раз уж я так ошибся со вторым потоком, может быть кто-нибудь подскажет как реализовать решение с его помощью?
задача в принципе неверно поставлена.
фокус в том, что сама идея модальных окон исключает получение сообщений любым окном, кроме модального. за исключением WM_PAINT.
т.е., если ты запускаешь диалог, используя xxx.DoModal(),
ни одно другое окно ничего, кроме собственного перерисовывания делать не сможет(по крайней мере, так официально сказано в MSDN).

кстати, а зачем тебе вообще два модальных диалога?
justanotheruser
0 / 0 / 0
Регистрация: 21.06.2009
Сообщений: 6
12.07.2009, 12:18  [ТС]     OnTimer и второй поток #5
почитал в MSDN'e. там вроде сказано что GetTopWindow() возвращает указатель на чаилд окна.. т.е. условие
if(GetTopWindow() == (CWnd*)this->m_hwnd)
никогда не выполнится т.к. сам длг1 себе не чаилд. у меня по GetTopWindow() приходит указатель на хендл CTabCtrl'a который лежит на длг1
или я что-то не так понял?
проверил свойства длг1. и он не модальный.
Patch
2276 / 491 / 11
Регистрация: 01.04.2009
Сообщений: 2,178
12.07.2009, 12:50     OnTimer и второй поток #6
1)
GetTopWindow Function

--------------------------------------------------------------------------------

The GetTopWindow function examines the Z order of the child windows associated with the specified parent window and retrieves a handle to the child window at the top of the Z order.

Syntax

HWND GetTopWindow( HWND hWnd
);
Parameters

hWnd
[in] Handle to the parent window whose child windows are to be examined. If this parameter is NULL, the function returns a handle to the window at the top of the Z order.
Return Value

If the function succeeds, the return value is a handle to the child window at the top of the Z order. If the specified window has no child windows, the return value is NULL. To get extended error information, use the GetLastError function.
обратить внимание на эту часть:
C++
1
If this parameter is NULL, the function returns a handle to the window at the top of the Z order.
перевожу: Если параметр = NULL, функция возвращает хэндл окна на самом верху по координате z.
он действительно может давать хэндл CTabCtrl'а, если тот рисовался после окна, в которое ты выводишь свой текст со временем.
это уже более сложный вариант.
у тебя там несколько элементов управления.
самостоятельно строить z-дерево и разбираться кто там чей потомок - дело муторное.
С с MFC можно сделать так:
при создании диалога делаешь
C++
1
CWnd * parent = this->GetParentOwner(); //исходный диалог.
а вместо GetTopWindow проще использовать GetForegroundWindow( )
в void CN2Dlg::OnTimer(UINT nIDEvent)
пишешь:
C++
1
2
CWnd * сparent = GetForegroundWindow( );
if(cparent == parent)...
и дальше по тексту

2)
а что диалог не модальный - я сильно сомневаюсь.
чтобы его сделать нужны приличные познания в работе CDialog, которых у тебя явно нет.
учись.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2009, 12:55     OnTimer и второй поток
Еще ссылки по теме:

C++ Поток и принтер
Скопировать поток и добавить ошибки в поток C++
Очистить поток C++
C++ Скопировать поток в поток
C++ Найти второй самый большой элемент массива и второй самый маленький элемент массива

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

Или воспользуйтесь поиском по форуму:
justanotheruser
0 / 0 / 0
Регистрация: 21.06.2009
Сообщений: 6
14.07.2009, 12:55  [ТС]     OnTimer и второй поток #7
спасибо! получилос!!
Yandex
Объявления
14.07.2009, 12:55     OnTimer и второй поток
Ответ Создать тему
Опции темы

Текущее время: 04:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru