powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / поток какой-то не такой
7 сообщений из 7, страница 1 из 1
поток какой-то не такой
    #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
поток какой-то не такой
    #34863818
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну ёпта. Как написали, так и работает. Что непонятно-то?
...
Рейтинг: 0 / 0
поток какой-то не такой
    #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
поток какой-то не такой
    #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
поток какой-то не такой
    #34863867
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насколько я понимаю, поток отослав WM_DOSOMETHING не ждет ее результатов, так ?
--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
поток какой-то не такой
    #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
поток какой-то не такой
    #34863914
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teras , большое спасибо
--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / поток какой-то не такой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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