Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.22;
Скачать: CL | DM;

Вниз

Как наложить семафор?   Найти похожие ветки 

 
Gnom   (2002-05-01 17:32) [0]

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


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

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


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

ваще то конечно наверное правильнее сказать не "на действия", а на переменную.
Ну т.е. скажем есть процедура, срабатывающая при некотором условии и может сложиться ситуация когда событие наступило, обработка началась, но еще не успело она закончиться как наступило опять такое же событие и соответственно параллельно началось выполнение этоой же процедуры. А надо шоб она не могла выполняться параллельно...
Ну например есть переменная 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.

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


 
Anatoly Podgoretsky ©   (2002-05-01 18:30) [3]

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


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

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


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

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


 
Anatoly Podgoretsky ©   (2002-05-01 19:09) [6]

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


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

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


 
Anatoly Podgoretsky ©   (2002-05-01 19:41) [8]

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


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

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

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

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


 
Anatoly Podgoretsky ©   (2002-05-01 20:06) [10]

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


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

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


 
NA ©   (2002-05-01 23:54) [12]

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

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



Страницы: 1 вся ветка

Текущий архив: 2002.07.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
1-70716
nwc_eminem
2002-07-11 15:14
2002.07.22
Как получить параметры, переданные при запуске программы?


3-70654
Squ
2002-07-02 10:03
2002.07.22
Halcyon...исходники


1-70791
Cowboy
2002-07-10 09:11
2002.07.22
Drag&Drop и DblClick


1-70779
Дундук
2002-07-05 03:53
2002.07.22
Маска в StringGrid


3-70584
Zamiran
2002-06-28 15:47
2002.07.22
Помогите пожалуйста !!!!!!