Главная страница
    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
3-70607
denis_tkachov
2002-06-30 17:18
2002.07.22
TThread и TQuery


1-70809
Dinara
2002-07-10 15:28
2002.07.22
Как узнать, выделен ли какой-нибудь итем в ListView?


3-70619
Боева Наталья
2002-07-01 07:23
2002.07.22
Обновление данных


1-70723
nitro313
2002-07-11 14:37
2002.07.22
Как присвоить к Caption строковое значение в одинарных кавычках?


14-70915
SPeller
2002-06-25 16:12
2002.07.22
HTML и JavaScript





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский