Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2012, 02:46   #11
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

сколько бы их там не накопилось, вы всё-равно увидите только конечный результат. никто не будет откладывать в памяти все промежуточные значения, посланные в SetWindowText(). Когда ваш цикл закончится и очередь дойдет до обработки WM_PAINT, будет отрисован текущий текст окошка, т.е. тот текст, который был назначен на последнем прогоне цикла. И да, виндовс не будет посылать новые WM_PAINT, если в очереди есть необработанные сообщения:

Цитата:
The system sends this message when there are no other messages in the application's message queue.
так что ни о каких 500 необработанных WM_PAINT речи быть не может.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 11.06.2012, 04:10   #12
Лета
Пользователь
 
Регистрация: 10.06.2012
Сообщений: 44
По умолчанию

Спасибо еще раз! Большое спасибо!

А так со всеми сообщениями: "виндовс не будет посылать новые WM_..., если в очереди есть необработанные сообщения WM_..."?
Лета вне форума Ответить с цитированием
Старый 11.06.2012, 10:20   #13
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

нет, например, WM_TIMER будет посылаться столько раз, сколько нужно, сколько бы их там не накопилось. Думаю, большинство сообщений так же будут накапливаться. Для WM_PAINT (и может ещё для каких-то) скорее сделано исключение.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 11.06.2012, 15:01   #14
Лета
Пользователь
 
Регистрация: 10.06.2012
Сообщений: 44
По умолчанию

Спасибо! Кажется, теперь ясно!

А в продолжении к теме о потоках:
Почему, если писать:
Код:
 
CreateThread(0,0,Thread1,hEd,0,0);
CreateThread(0,0,Thread1,hEd1,0,0);
Так будет видно, что выполняется два потока. А если создать два потока вида:
Код:
CreateThread(0,0,Thread1,hEd,0,0);
CreateThread(0,0,Thread1,hEd,0,0);
Будет визуально то же самое, что и если б создали один поток?

Код:
WORD WINAPI Thread1(LPVOID lp)
{

	HWND hWnd = (HWND)lp;
	for(int i=0;i<500;++i)
	{
		TCHAR buf[10];
		wsprintf(buf,L"%d",i);
		Sleep(100);
		SetWindowText(hWnd,buf);
	}
	return 0;
}
Лета вне форума Ответить с цитированием
Старый 11.06.2012, 20:14   #15
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

я бы не рекомендовал так делать. фактически, вы без синхронизации начинаете из двух разных потоков оперировать одним объектом. в любой момент исполенние кода SetWindowText() одним потоком может быть прервано, и управление отдано другому потоку, который так же вызовет SetWindowText() для того же окна. в принципе, гуй это должен пережить, но я бы сильно на это не расчитывал. Вас спасает только то, что оба потока 99% времени спят, так что друг другу они не мешают. выглядит как один поток скорей всего потому, что один поток шагает чуть впереди, а другой чуть за ним. первый поток присваивает окну текст "0" и засыпает, потом второй поток делает то же самое. А возьмите random() вместо i, или ещё как-то по-разному назначайте текст из разных потоков, и сразу должно стать заметно, что текст меняется ненормально.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 12.06.2012, 02:02   #16
Лета
Пользователь
 
Регистрация: 10.06.2012
Сообщений: 44
По умолчанию

А опасность в несинхронизированном использовании потоков только из-за того, что здесь, к примеру, два потока работает с одним и тем же элементом управления(Edit), или совместное использование переменных также опасно?(ну помимо того, что в каждый момент времени мы не сможем точно знать значение переменной - пусть с этим мы согласны)

Спасибо еще раз за помощь!
Лета вне форума Ответить с цитированием
Старый 12.06.2012, 13:39   #17
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Считается, что переменные безболезненно могут читать общие переменные, но записывать их - только через механизмы синхронизации.
Но это не совсем так.
Например, нам может понадобиться, при возникновении некоторого признака однократно выполнить какое-либо действие. Для обеспечения однократности нужно перевести признак в прежнее состояние.
Но этот признак могут одновременно прочитать несколько потоков и действие не будет однократным.
В этом случае вся "транзакция" (т.е. как чтение признака, так и его запись) должна быть выполнена с применением синхронизации.
s-andriano вне форума Ответить с цитированием
Старый 12.06.2012, 14:44   #18
Лета
Пользователь
 
Регистрация: 10.06.2012
Сообщений: 44
По умолчанию

Ну а если нам, в принципе, все равно на значение переменной, какое будет такое и будет, можно ли позволить, чтоб ею могли пользоваться два потока одновременно? (может, в этом и мало смысла, но все же)
Лета вне форума Ответить с цитированием
Старый 12.06.2012, 15:02   #19
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

во-первых, у вас тут нет разделяемой переменной. копия переменной i в каждом потоке своя. а визуальный контрол достаточно сложный объект, и им бы я не рекомедовал пользоваться без синхронизации.
во-вторых, "пользоваться" можно по-разному. чтение считается обычно безопасным, запись нужно синхронизировать.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 12.06.2012, 15:03   #20
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Еще раз: если мы переменную ТОЛЬКО читаем и при этом не делаем попыток ее впоследствии перезаписать, то может пользоваться сколько угодно потоков.
Если переменная нам не нужна, ее следует исключить из программы, равно как и обращения к ней.
Не нужно к ней обращаться. Вообще. Ни из какого потока.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Класс запускает поток, который заполняет этот класс. Обмен класс <=> поток. Человек_Борща Общие вопросы Delphi 8 27.02.2012 23:24
[Проблема] - Прервать закачку, закрыть поток(tthread) Функция(WinInet) Человек_Борща Работа с сетью в Delphi 0 14.12.2010 20:21
Поток. Не получается создать поток. Выдает ошибки при запуске bigory Общие вопросы по Java, Java SE, Kotlin 3 23.09.2010 00:40
поток Артэс Общие вопросы C/C++ 3 09.12.2009 22:20
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50