Форум: "Система";
Текущий архив: 2002.07.22;
Скачать: [xml.tar.bz2];
ВнизКак наложить семафор? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c