![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 | |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
сколько бы их там не накопилось, вы всё-равно увидите только конечный результат. никто не будет откладывать в памяти все промежуточные значения, посланные в SetWindowText(). Когда ваш цикл закончится и очередь дойдет до обработки WM_PAINT, будет отрисован текущий текст окошка, т.е. тот текст, который был назначен на последнем прогоне цикла. И да, виндовс не будет посылать новые WM_PAINT, если в очереди есть необработанные сообщения:
Цитата:
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
|
![]() |
![]() |
![]() |
#12 |
Пользователь
Регистрация: 10.06.2012
Сообщений: 44
|
![]()
Спасибо еще раз! Большое спасибо!
А так со всеми сообщениями: "виндовс не будет посылать новые WM_..., если в очереди есть необработанные сообщения WM_..."? |
![]() |
![]() |
![]() |
#13 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
нет, например, WM_TIMER будет посылаться столько раз, сколько нужно, сколько бы их там не накопилось. Думаю, большинство сообщений так же будут накапливаться. Для WM_PAINT (и может ещё для каких-то) скорее сделано исключение.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#14 |
Пользователь
Регистрация: 10.06.2012
Сообщений: 44
|
![]()
Спасибо! Кажется, теперь ясно!
А в продолжении к теме о потоках: Почему, если писать: Код:
Код:
Код:
|
![]() |
![]() |
![]() |
#15 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
я бы не рекомендовал так делать. фактически, вы без синхронизации начинаете из двух разных потоков оперировать одним объектом. в любой момент исполенние кода SetWindowText() одним потоком может быть прервано, и управление отдано другому потоку, который так же вызовет SetWindowText() для того же окна. в принципе, гуй это должен пережить, но я бы сильно на это не расчитывал. Вас спасает только то, что оба потока 99% времени спят, так что друг другу они не мешают. выглядит как один поток скорей всего потому, что один поток шагает чуть впереди, а другой чуть за ним. первый поток присваивает окну текст "0" и засыпает, потом второй поток делает то же самое. А возьмите random() вместо i, или ещё как-то по-разному назначайте текст из разных потоков, и сразу должно стать заметно, что текст меняется ненормально.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#16 |
Пользователь
Регистрация: 10.06.2012
Сообщений: 44
|
![]()
А опасность в несинхронизированном использовании потоков только из-за того, что здесь, к примеру, два потока работает с одним и тем же элементом управления(Edit), или совместное использование переменных также опасно?(ну помимо того, что в каждый момент времени мы не сможем точно знать значение переменной - пусть с этим мы согласны)
Спасибо еще раз за помощь! |
![]() |
![]() |
![]() |
#17 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
Считается, что переменные безболезненно могут читать общие переменные, но записывать их - только через механизмы синхронизации.
Но это не совсем так. Например, нам может понадобиться, при возникновении некоторого признака однократно выполнить какое-либо действие. Для обеспечения однократности нужно перевести признак в прежнее состояние. Но этот признак могут одновременно прочитать несколько потоков и действие не будет однократным. В этом случае вся "транзакция" (т.е. как чтение признака, так и его запись) должна быть выполнена с применением синхронизации. |
![]() |
![]() |
![]() |
#18 |
Пользователь
Регистрация: 10.06.2012
Сообщений: 44
|
![]()
Ну а если нам, в принципе, все равно на значение переменной, какое будет такое и будет, можно ли позволить, чтоб ею могли пользоваться два потока одновременно? (может, в этом и мало смысла, но все же)
|
![]() |
![]() |
![]() |
#19 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
во-первых, у вас тут нет разделяемой переменной. копия переменной i в каждом потоке своя. а визуальный контрол достаточно сложный объект, и им бы я не рекомедовал пользоваться без синхронизации.
во-вторых, "пользоваться" можно по-разному. чтение считается обычно безопасным, запись нужно синхронизировать.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#20 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
Еще раз: если мы переменную ТОЛЬКО читаем и при этом не делаем попыток ее впоследствии перезаписать, то может пользоваться сколько угодно потоков.
Если переменная нам не нужна, ее следует исключить из программы, равно как и обращения к ней. Не нужно к ней обращаться. Вообще. Ни из какого потока. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Класс запускает поток, который заполняет этот класс. Обмен класс <=> поток. | Человек_Борща | Общие вопросы 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 |