Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
justanotheruser
0 / 0 / 0
Регистрация: 21.06.2009
Сообщений: 6
#1

OnTimer и второй поток

11.07.2009, 17:24. Просмотров 2039. Ответов 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);
}
заранее благодарен)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2009, 17:24
Ответы с готовыми решениями:

console win32 ontimer
Здравствуйте, как включить таймер в консольном приложении? Суть задачи: через...

Скопировать поток и добавить ошибки в поток
Здорова господа! Есть задачка: "Скопируйте поток объектов типа...

Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде локальной переменной внутри функции.
Совсем не понял эту тему. Нужно создать базу данных (создать пустой бинарный...

Скопировать поток в поток
Есть ли возможность скопировать один поток в другой. Например int...

Найти второй самый большой элемент массива и второй самый маленький элемент массива
Помогите пожалуйста: Найти второй самый большой элемент массива и второй самый...

6
Patch
2336 / 492 / 22
Регистрация: 01.04.2009
Сообщений: 2,181
11.07.2009, 18:00 #2
немного не так.
можешь сделать первый диалог не модальным.
или, в этой функции OnTimer проверяй кто является окном верхнего уровня,
и если верхнее !=this, то вывод времени не делаешь.
и все.
никаких вторых потоков.
1
justanotheruser
0 / 0 / 0
Регистрация: 21.06.2009
Сообщений: 6
11.07.2009, 18:08  [ТС] #3
Patch, спасибо. эм.. можно функцию для проверки которое из окон является окном верхнего уровня?(я многого не знаю. по-этому, собственно и в разделе Для начинающих )

ну раз уж я так ошибся со вторым потоком, может быть кто-нибудь подскажет как реализовать решение с его помощью? а то тема получилась совсем не по теме (извините за каламбур)
0
Patch
2336 / 492 / 22
Регистрация: 01.04.2009
Сообщений: 2,181
12.07.2009, 08:22 #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).

кстати, а зачем тебе вообще два модальных диалога?
0
justanotheruser
0 / 0 / 0
Регистрация: 21.06.2009
Сообщений: 6
12.07.2009, 12:18  [ТС] #5
почитал в MSDN'e. там вроде сказано что GetTopWindow() возвращает указатель на чаилд окна.. т.е. условие
if(GetTopWindow() == (CWnd*)this->m_hwnd)
никогда не выполнится т.к. сам длг1 себе не чаилд. у меня по GetTopWindow() приходит указатель на хендл CTabCtrl'a который лежит на длг1
или я что-то не так понял?
проверил свойства длг1. и он не модальный.
0
Patch
2336 / 492 / 22
Регистрация: 01.04.2009
Сообщений: 2,181
12.07.2009, 12:50 #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, которых у тебя явно нет.
учись.
0
justanotheruser
0 / 0 / 0
Регистрация: 21.06.2009
Сообщений: 6
14.07.2009, 12:55  [ТС] #7
спасибо! получилос!!
0
14.07.2009, 12:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2009, 12:55

SetTimer и OnTimer: зачем вызывают метод OnTimer из базового класса?
Читаю МСДН по SetTimer здесь...

Не запускается второй поток
Не понимаю, но такое ощущение, что второй поток не запускается(MessageBox не...

Не запускается второй поток
Задача: первый поток генерирует в буфер 100 чисел, в интервале от 1 до 16;...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru