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