Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как наложить семафор? [D5, Win95/98, WinME, NT4, Win2k]


Gnom ©   (2002-05-01 17:32:00) 

Можно ли как-нибудь наложить семафор на некоторые действия?


NA   (2002-05-01 23:54:00) [1]

На форуме iXBT _простая_ блокировка или сложная? :-)))))

Мне кажется, умудриться там две мессаги подряд отправить просто нереально.
Если, конечно, не сделать аппаратный эмулятор мыши со страшным дребезгом в момент клика :)


Gnom   (2002-05-01 22:39:00) [2]

И тем не менее при простой блокировке кнопки имеет место быть ошибка :(


Anatoly Podgoretsky   (2002-05-01 20:06:00) [3]

Ну хотя бы поддержкой на уровне ядра, а что касается его случая может действительно ему и блокировки кнопки хватит


ZZ   (2002-05-01 19:56:00) [4]

Anatoly Podgoretsky
Но чем это лучше переменной (для одного процесса естественно)

Gnom
Как промежуточный вариант - заблокировать кнопку обновления до полной загрузки(окончания записи в файл).

Вот я думаю как надо нажимать на refresh, чтобы заломать твой код? Там же до busy:=true проходят миллисекунды..


Anatoly Podgoretsky   (2002-05-01 19:41:00) [5]

Gnom (01.05.02 19:29)
Ты посмотри сначала в хелпе все, что касается семафоров, подойдет ли тебе и какие конкретные вопросы появятся, но вроде подойдет, конечно это не единственнй элемент ядра для синхронизации, например есть еще мьютексы.
В хелпе по синхронизации примерно 30 функций, темы называется "Synchronization Functions", связанная "Synchronization Objects"
После этого у тебя появится определенная ясность в этом вопросе.


Gnom   (2002-05-01 19:29:00) [6]

А действительно, может все решается как то совсем иначе, а я тут вместо того, чтоб сказать доктору что болит сам себе диагноз ставлю :-))) Тем более что опыта мне явно не хватает :-(
Исходно проблема такая:
Надо из отображать картинки, хранящиеся БД. Я гружу ее в BLOB поле и сохраняю в файл. После этого компонентом TWebBrowser спокойно отображаю. Все бы ничего, но проблема начинается когда давишь кнопку "следующая"(реализация своя) быстро несколько раз. Когда давишь один раз или несколько но с некоторым промежутком - все ОК. А если пару раз быстро - беда.
Я так понимаю, что при этом после первого нажатия присходит запись в мой временный файл, а в это время второй "экземпляр" процедуры пытается записать в него же, и в результате - ошибка.


Anatoly Podgoretsky   (2002-05-01 19:09:00) [7]

Не ну примера у меня нет, только хелп, там всего три функции, но может тебе по задаче вообще не подойдет.


ZZ   (2002-05-01 19:04:00) [8]

Я теперь ничего не понимаю :) Если ты используешь семафор ( кстати, почему именно семафор то?), то у него тоже надо менять состояния. А если процедуры запустились почти одновременно, то получаем то-же самое... Или нет?


Gnom   (2002-05-01 18:45:00) [9]

Ээээ...Наверное подойдет... Если Вас не затруднит, не могли бы Вы дать пример использования? На таком же уровне(с одной переменной)


Anatoly Podgoretsky   (2002-05-01 18:30:00) [10]

Ну а CreateSemaphore не подойдет для этой цели?


Gnom   (2002-05-01 18:23:00) [11]

ваще то конечно наверное правильнее сказать не "на действия", а на переменную.
Ну т.е. скажем есть процедура, срабатывающая при некотором условии и может сложиться ситуация когда событие наступило, обработка началась, но еще не успело она закончиться как наступило опять такое же событие и соответственно параллельно началось выполнение этоой же процедуры. А надо шоб она не могла выполняться параллельно...
Ну например есть переменная a, которая видна всему приложению. И пусть она изначальноравна 0. И есть кусок кода:

b:=a
.......
b:=a+1
.......
a:=b

Если событие приводящее к его выполнению наступит в момент когда код уже выполняется, то после окончания второго процесса в a будет значение 1 а не 2, хотя код выполнился дважды.

Вариант
public busy:boolean
.....
procedure myproc()
begin
while busy begin
end
busy:=true
...........
busy:=false;
end;

не годится, т.к. если два процесса начались практически одновременно, то возможно, что второй процесс считает busy раньше чем первый установит его в True.

А с семафор - это механизм для представляющий НЕДЕЛИМУЮ операцию проверки и изменения переменной (ну не только конечно).


ZZ   (2002-05-01 17:35:00) [12]

Ну.... Ибо ммммм... Ну как тебе сказать...
В общем перефразируй вопрос пожалуйста, а то еще не все поняли, что значит наложить семафор..


Наверх

Титульная страница Поиск, карта сайта Написать письмо