Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / поток какой-то не такой / 7 сообщений из 7, страница 1 из 1
11.10.2007, 15:31:47
    #34863622
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поток какой-то не такой
win32api vc2005sp1, диалоговое приложение.

диалог в момент своей инициализации (OnInitDialog) создает поток, в котором реализованы примитивные часы, следующим образом (xDialog и xString мои классы для диалога и строк соответственно, все остальное - секунды, минуты и тд - это int)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
  xDialog* pDlg = (xDialog)wParam;
  xString stat_str;
  while(pDlg->g_stopper ==  0 )					// пока не приказали остановиться
	{
		::Sleep( 1000 );							      // каждую секунду				
		nSeconds++;
		if (nSeconds ==  60 )
		{
			nSeconds =  0 ;
			nMinutes++;
			if (nMinutes ==  60 )					    // новая минута
			{
				nMinutes =  0 ;
				nHours++;
				if (nHours ==  24 )				      // новый час
				{
					nHours =  0 ;
					nDays++;					          // новый день
				}
			}
		}
	
		stat_str.Format(_T("%.2dd:%.2dh:%.2dm:%.2ds"), nDays, nHours, nMinutes, nSeconds);
		pDlg->SettStatistics(stat_str);
		if(nSeconds ==  5 )
			pDlg->SendMessage(WM_DOSOMETHING,  0 ,  0 );
}

т.е. часики бегут и выводят свое значение на диалог. Если при обработке сообщения WM_DOSOMETHING в классе диалога сделать задержку, то часики перестают ходить. Приложение ведет себя как однопотоковое, т.е. блокируется даже интерфейсный поток диалога, однако, если в момент, когда WM_DOSOMETHING не обрабатывается открыть еще один диалог (любой другой, родительским окном корого будет pDlg) как модальный, то видно что часы считают секунды.

Это так и должно быть или я чего-то не понимаю?

заранее в реверансе
--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
11.10.2007, 16:22:09
    #34863818
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поток какой-то не такой
ну ёпта. Как написали, так и работает. Что непонятно-то?
...
Рейтинг: 0 / 0
11.10.2007, 16:33:22
    #34863854
teras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поток какой-то не такой
Cerebrum wrote:
> stat_str.Format(_T("%.2dd:%.2dh:%.2dm:%.2ds"), nDays, nHours, nMinutes, nSeconds);
> pDlg->SettStatistics(stat_str);
....
> Это так и должно быть или я чего-то не понимаю?

Так и должно быть: при задержке не обрабатывается WM_PAINT.
pDlg->UpdateWindow должно помочь.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
11.10.2007, 16:36:24
    #34863861
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поток какой-то не такой
teras
Cerebrum wrote:
> stat_str.Format(_T("%.2dd:%.2dh:%.2dm:%.2ds"), nDays, nHours, nMinutes, nSeconds);
> pDlg->SettStatistics(stat_str);
....
> Это так и должно быть или я чего-то не понимаю?

Так и должно быть: при задержке не обрабатывается WM_PAINT.
pDlg->UpdateWindow должно помочь.
Posted via ActualForum NNTP Server 1.4
получается что отрисовка времени просто не должна проходить, но почему после того как задержка преодалена счетчик не прыгает на несколько секунд вперед, а продолжает с того места, где затормозил!?
...
Рейтинг: 0 / 0
11.10.2007, 16:38:37
    #34863867
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поток какой-то не такой
насколько я понимаю, поток отослав WM_DOSOMETHING не ждет ее результатов, так ?
--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
11.10.2007, 16:47:46
    #34863907
teras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поток какой-то не такой
Cerebrum wrote:
> Автор: "Cerebrum"
> teras
>
> Cerebrum wrote:
>> stat_str.Format(_T("%.2dd:%.2dh:%.2dm:%.2ds"), nDays, nHours,
> nMinutes, nSeconds);
>> pDlg->SettStatistics(stat_str);
> ....
>> Это так и должно быть или я чего-то не понимаю?
>
> Так и должно быть: при задержке не обрабатывается WM_PAINT.
> pDlg->UpdateWindow должно помочь.
> Posted via ActualForum NNTP Server 1.4
>
>
> получается что отрисовка времени просто не должна проходить, но почему
> после того как задержка преодалена счетчик не прыгает на несколько
> секунд вперед, а продолжает с того места, где затормозил!?

Это происходит из-за SendMessage - она ждет завершения обработки
сообщения. То есть в приведённом коде через каждый пять секунд часы
могут остановиться. На эту тему есть PostMessage.
И еще совет - лучше раз в секунду запрашивать время у системы, а не
считать интервалы - Sleep гфрфнтирует только минимальное время обработки
- то, что он не выйдет раньше чем через секунду. Но максимальное время -
ничем не ограничено, и может быть гораздо больше, при загруженной
системе, свопировании и т.д.

Кстати, если посмотреть на ваш код, но использование отдельного потока
выглядит избыточным, точно с таким же эффектом можно пользовать WM_TIMER.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
11.10.2007, 16:50:56
    #34863914
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
поток какой-то не такой
teras , большое спасибо
--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / поток какой-то не такой / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]