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

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

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2013, 11:59   #11
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

CRITICAL_SECTION реентрантна, поэтому вызов EnterCriticalSection дважды из одного потока синхронизации не дает. Вы входите в секцию при первом нажатии кнопки, потом, пока ждете завершения потока, прокручиваете сообщения и получаете второе нажатие, в том же UI потоке, что и первое нажатие и входите в секцию второй раз, создаете второй поток и тд. Получаетеся, что UI инициализирует ваши данные второй раз, во время работы первого потока.
waleri вне форума Ответить с цитированием
Старый 30.09.2013, 12:02   #12
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

waleri, да, я знаю. Именно поэтому я и попытался использовать синхронизацию потока с помощью флага. Но почему происходит зависание?

Цитата:
откуда ты это выражение взял то?
Это из личных представлений о работе окон.)
В планах порабощение вселенной...

Последний раз редактировалось zumm; 30.09.2013 в 12:12.
zumm вне форума Ответить с цитированием
Старый 30.09.2013, 12:23   #13
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Может флажок volatile ом сделать ?
the_deer_one вне форума Ответить с цитированием
Старый 30.09.2013, 12:27   #14
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Цитата:
Может флажок volatile ом сделать ?
Поподробнее.
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 30.09.2013, 12:41   #15
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Ну специальная фигня такаяб что бы ничего хитро не закешировалось.
http://en.wikipedia.org/wiki/Volatile_variable
the_deer_one вне форума Ответить с цитированием
Старый 30.09.2013, 12:45   #16
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

the_deer_one, не вижу в этом смысла. Флаг не подвергается оптимизации компилятора.
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 30.09.2013, 13:21   #17
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от zumm Посмотреть сообщение
Но почему происходит зависание?
Потому что обнуление флага делается в UI потоке, который при повторном нажатии случае зашел в while(flag) { } и никогда от туда не вышел.
waleri вне форума Ответить с цитированием
Старый 30.09.2013, 13:23   #18
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

waleri, такс... Не могли бы вы мне объяснить логику работы? При повторном нажатии на кнопку, куда идет UI поток? Он тормозит обработку первого вызова и переходит ко второму? Так? После обработки второго вывоза он возвращается к обработке первого вызова?
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 30.09.2013, 13:58   #19
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

передлагаю рассмотреть такую схему работы

1. UI поток. с помощью кр. секции (или без нее) готовим данные. затем стартуем поток(пока БЕЗ блокировки). (с передачей! данных)
2. MY поток. СРАЗУ при старте! блокируем "свои" данные с помощью кр. секции. и считаем
3. UI периодически (таймер!!!) проверяем готовность расчета(блокировку данных).
4. MY поток заканчивает расчет и разблокирует "освобождаем" данные.
5. UI поток проверяем блокировку. принимаем и чистим. (на самом деле это другая ветвь п.3 ) если занято то выход иначе очистить

Нет пляски с "петлей" (вся пляска "прячется" в таймер") .
Нет никаких флагов, точнее таковым выступает сама критическая секция (для чего собственно она и предназначена)!

А если потоку добавить функциональность по извещению UI о конце расчетов (CallBack функцию / PostMessage(WM_USER+... ) ), то и таймер становится не нужным.

Offtop: О да при этом мы "перешли" от функциональной модели работы к "почти" событийной.


Цитата:
СРАЗУ при старте
означает сразу при входе в потоковую функцию!!! ThreadProcedure!
Цитата:
поток заканчивает расчет и разблокирует "освобождаем" данные.
В конце потоковой функции!! ThreadProcedure!

Код:
procedure ThreadPRocedure;
{
  EnterCriticalSection(LockSection); //сразу при старте
....// здесь что-то считаем
  LeaveCriticalSection(LockSection); // в конце расчета или ПРИ СБОЕ ! ( try ... finally )
}
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 30.09.2013 в 14:28.
evg_m вне форума Ответить с цитированием
Старый 30.09.2013, 14:24   #20
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

а вариант с флагом и лупом почему не работал, на вид он стрёмный, но работать то должен хотя бы в большинстве случаев.
the_deer_one вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синхронизация kuba1981 PHP 9 06.05.2013 11:39
Как получить доступ к методу потока(TThread) из основного потока? Pcrepair Общие вопросы Delphi 3 30.03.2013 14:52
проблема при копировании одного столбца из одного файла в другой файл tanunya Помощь студентам 0 24.02.2012 21:30
Должно быть 3 потока. А диспетчер задач показывает, что потока создано 2 BEL9ILLI Общие вопросы Delphi 3 06.12.2011 20:26
Как узнать номер потока из самого потока? GaMeSTeR Помощь студентам 0 03.12.2010 09:50