Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.005 c
14-70927
Pat
2002-06-23 17:43
2002.07.22
Проблема выбора винта


14-70913
Giga-Byte
2002-06-26 10:15
2002.07.22
Есть где-нить компонент Grid, чтобы помещать иконки


3-70611
officeman
2002-06-30 17:41
2002.07.22
(bdase) что за логин и пароль ???


1-70722
Ivan61
2002-07-10 23:46
2002.07.22
Калькулятор!?


1-70700
SuperVK
2002-07-11 10:09
2002.07.22
Как убрать первый нередактируемый столбец в TStringGrid?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский