Ошибка из-за выполнения параллельных процессов

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Andr222
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 31.05.2010 (Пн) 10:17
Откуда: Краснодар

Ошибка из-за выполнения параллельных процессов

Сообщение Andr222 » 11.08.2010 (Ср) 12:32

Столкнулся с проблемой выполнения параллельных процессов!
Из формы в которой есть GRID, при двойном клике по Grid вызывается окно в модальном режиме для редактирования одной записи. Соответственно в поцедуре окна редактирования создается новый Recordset, который содержит только редактируемую запись.

'процедура редактирования записи в модальном окне
Private Sub CmdSave_Click()
adorecLineRedaktor.Fields(1) = Val(Str(Combo(0).Text))
adorecLineRedaktor.Fields(2) = Combo(1).Text
adorecLineRedaktor.Fields(3) = Val(Combo(2).Text)
adorecLineRedaktor.Fields(4) = CDbl(TextSoprotivlenie.Text)
adorecLineRedaktor.update
adorecLineRedaktor.Close
Set adorecLineRedaktor = Nothing
Unload Me
End Sub

По окончании выполнения процедуры редактировния выполнение программы переходит обратно в форму, которая вызывала модальное окно редактирования. Там выполняется метод Refresh элемента управления данными, для отображения в Grid внесенных изменений, но изменеия не отображаются в Grid. Я так понимаю метод adorecLineRedaktor.update выполняется параллелно метода Adodc1.Refresh, и update заканчивается позже Refresh. Поэтому фактически изменения в базе еще не произошли, а сетка Grid уже обновилась, соответственно старыми значениями. При пошаговом выполнении программы все работает правильно, но если запустить проект, то выползает такая ошибка. Пробовал ставить задержку времени перед выполнением Adodc1.Refresh, тогда все работает правильно. Проблема как определить время задержки, так так приложение должно работать по сети, и соответственно на разных по производительности машинах.
Если кто сталкивался с такой проблемой помогите решить. Может быть есть какие-то альтернативные варианты? В идеальном варианте хочется заставить выполнять последовательно методы Update и Refresh!!!

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Ошибка из-за выполнения параллельных процессов

Сообщение FireFenix » 11.08.2010 (Ср) 13:33

Что мешает в главной программе обрабатывать результат модального окна?

Код: Выделить всё
'Имеем окно Dialog_Text со свойством Result as Text

Sub Click()
    Dim Dialog as new Dialog_Text()
    Dialog.ShowDialog()
   
    If Dialog.DialogResult AndAlso Not String.IsEmtyOrNull(Dialog.Result) Then
        'Обновляем Grid с результатом Dialog.Result
    End if
End Sub

Думаю типа так

Вообще может быть вагон причин... Давай весь код - покурим...
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Ошибка из-за выполнения параллельных процессов

Сообщение HandKot » 12.08.2010 (Чт) 7:25

я зачем для редактирования создавать новый рекордсет?
почему не работать с одним и темже?
I Have Nine Lives You Have One Only
THINK!

Andr222
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 31.05.2010 (Пн) 10:17
Откуда: Краснодар

Re: Ошибка из-за выполнения параллельных процессов

Сообщение Andr222 » 12.08.2010 (Чт) 9:06

FireFenix писал(а):Что мешает в главной программе обрабатывать результат модального окна?

Код: Выделить всё
'Имеем окно Dialog_Text со свойством Result as Text

Sub Click()
    Dim Dialog as new Dialog_Text()
    Dialog.ShowDialog()
   
    If Dialog.DialogResult AndAlso Not String.IsEmtyOrNull(Dialog.Result) Then
        'Обновляем Grid с результатом Dialog.Result
    End if
End Sub

Думаю типа так

Вообще может быть вагон причин... Давай весь код - покурим...


Так надо теперь осмыслить все это! Извини, но программировать начал совсем недавно, еще пока во многих вещах не разбираюсь. Я осмыслю все это, если не поможет, обязательно покурим весь код. Спасибо за помощь!!!

Andr222
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 31.05.2010 (Пн) 10:17
Откуда: Краснодар

Re: Ошибка из-за выполнения параллельных процессов

Сообщение Andr222 » 12.08.2010 (Чт) 10:14

HandKot писал(а):я зачем для редактирования создавать новый рекордсет?
почему не работать с одним и темже?


Рекордсет который отображается в Grid состоит из множества записей, так как приложение планируется использовать по сети, то я делаю рекордсет статический, чтоб не блокировать в базе отображенные записи и дать возможность работать с базой другим пользователям. При вызове окна редактирования, создается новый рекордсет, который содержит только одну запись для редактирования, соответственно новый рекордсет блокирует эту запись, и запрещает в этот момент редактировать эту запись другим пользователям. Именно для этого я и создаю новый рекордсет.
Может есть другие варианты решения этой задачи, а я по своей неопытности не знаю их! Рад любым советам!

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Re: Ошибка из-за выполнения параллельных процессов

Сообщение HandKot » 13.08.2010 (Пт) 10:29

понятно.
все выполняется последовательно и задержку ставить не надо

но изменеия не отображаются в Grid

а если закрыть программу и зайти, изменения будут видны?
если да, то надо протос обновить грид.
скорее всего там есть св-во Refresh
I Have Nine Lives You Have One Only
THINK!

Andr222
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 31.05.2010 (Пн) 10:17
Откуда: Краснодар

Re: Ошибка из-за выполнения параллельных процессов

Сообщение Andr222 » 13.08.2010 (Пт) 12:57

НЕ, дело не в refresh. При пошаговом выпонении все правильно работает и отображается в Grid. Но как только запускаю проект на выполнение, то сетка обновляется старыми значениями из базы. Не уже ли Update так долго выполняется. Я даже создал отдельную кнопку, для выполнения Refresh но только не сетки, а элемента управления данными "Adodc". И вот когда вношу изменения в модальном окне, нажимаю сохранить(соответственно выполняется Update), программа переходит к окну в котором и находится сетка grid, там же и отдельно созданная кнопка для выполнения метода Refreh элемента "adodc". В этот момент я жму несколько раз подряд эту кнопку обновления. И вот заметил, где-то только через 1-2-3 сек сетка обновляется новыми значениями из базы. Я думаю, что проблема именно в том, что идут два параллельных процесса, один обновляет базу, а второй обновляет набор записей для отображения в сетке. И процесс обновления сетки заканчивается на много быстрее, чем обновление базы. Вот уже подумываю может зациклить обновление сетки, до тех пор пока не пройдут изменения. Т. е. цикл с условием выхода, только после обновления значений в сетке. Но думаю, что это замедлит работу метода Update. Наверно это не лучший вариант решения поставленной задачи!!!

Andr222
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 31.05.2010 (Пн) 10:17
Откуда: Краснодар

Re: Ошибка из-за выполнения параллельных процессов

Сообщение Andr222 » 19.08.2010 (Чт) 16:07

Ну вот и все!!!! Проблема решена!!!
Раньше было вот так:
В модальном окне происходило обновление базы данных
....
adorecLineRedaktor.update
....
end sub
Далее программа переходила в окно, из которого вызавалось модальное окно для редактирования базы. В этом окне содержалась сетка для отображения внесенных изменений. Я думаю, пока выполнялся метод adorecLineRedaktor.update, параллельно начинался метод обновления другого Recordset, который предназначен для отображения в сетке. Потому, что update выполнялся дольше обновления сетки, сетка заполнялась старыми значениями.

Все очень просто вылечилос вылечилось. Всего навсего добавил метод Requery после Update!
With adorecLineRedaktor
.update
.Requery
End With
Я так понимаю что, теперь программа выполняется последовательно. Т.е. программа ждет окончания метода update, только потом переходит к методу Requery. Теперь когда выполняется метод Requery начинается параллельный процесс обновления сетки, для отображения внесенных изменений в базу. Так как update уже завершился, теперь сетка отображает новые значения!!! Может я и ошибаюсь, но все прекрасно работает!!!
ВСЕМ СПАСИБО!!!
Tема закрыта!


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

    TopList