Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.225.255.134] |
|
Сообщ.
#1
,
|
|
|
Грубо говоря, клиент и сервер терзают через ODBC Acsess·овскую БД. Может ли компонент, скажем, TDatabase из одного приложения каким-нибудь Event·ом понять, что в базу внесены изменения?
|
Сообщ.
#2
,
|
|
|
Может. См. CreateEvent()
|
Сообщ.
#3
,
|
|
|
Цитата Relaxander @ Может. См. CreateEvent() А подробней можно? |
Сообщ.
#4
,
|
|
|
так а что нужно-то? чтобы одно приложение узнало, что другое что-то изменило в БД?
тут есть варианты. 1. Читатель периодически опрашивает нужное место бд на предмет изменений 2. Писатель извещает читателя путем посылки сообщения (именованный канал, сокеты, MMF, ...) 3. Читатель запускает поток, в котором ждет созданный в обоих приложениях Mutex или Event - WaitForSingleObject (вернее, созданный в одном и открытый в другом). Писатель после изменения меняет статус объекта синхронизации, в результате чего читатель снимается с ручника и узнает об изменениях. ... придумайте сами А вообще зависит от глобальной постановки задачи - чего в итоге нужно добиться. Возможно, есть более простой и красивый способ |
Сообщ.
#6
,
|
|
|
Может. См. CreateEvent()
То есть штатных событий не предусмотрено? так а что нужно-то? чтобы одно приложение узнало, что другое что-то изменило в БД? Ну да. Я вот периодически и опрашиваю, но имхо это и не просто и не красиво к п.3 Нужно каким-то образом оформить поток? А то у меня его читатель все равно не видит... Добавлено Профиль · PM Рейтинг (т): [ 131 ] http://www.cromis.net/blog/downloads/cromis-ipc/ Не хотел бы пользоваться сторонними пакетами |
Сообщ.
#7
,
|
|
|
Цитата rdx0 @ Нужно каким-то образом оформить поток? Писатель hEvent := CreateEvent(nil, TRUE, FALSE, 'Global\DBChangeEvent'); MakeChangesInDB(); PulseEvent(hEvent); Читатель hThread := CreateThread(...,@DBChangeMonitorProc,...); function DBChangeMonitorProc(lpParameter: Pointer): DWORD; stdcall; { HANDLE hEvent := OpenEvent(SYNCHRONIZE, FALSE, 'Global\DBChangeEvent'); while (not Terminated) do begin if (WaitForSingleObject(hEvent, INFINITE) = WAIT_OBJECT_0) then begin // что-то изменили в БД... end; end; end; |
Сообщ.
#8
,
|
|
|
Пока не все понял, но благодарю за поддержку - с утра попробую. Немного настораживает while.. Я не считаю себя специалистом, но предполагал, что если событие произошло - обработал и забыл. Я не прав?
|
Сообщ.
#9
,
|
|
|
Цитата rdx0 @ если событие произошло - обработал и забыл именно так. Потом опять упираемся в WaitForSingleObject и ждем следующего события |
Сообщ.
#10
,
|
|
|
WaitForSingleObject - это WinApi?
|
Сообщ.
#11
,
|
|
|
Цитата rdx0 @ WaitForSingleObject - это WinApi? да, но можно и дельфийский класс юзать http://www.sql.ru/forum/1070223/sinhroniza...moshhu-event-ov |
Сообщ.
#12
,
|
|
|
Благодарю, снова понял процентов 40 )) Выходные пройдут в сосредоточенном курении мануалов
Добавлено while уже не настораживает - выходные начинаются с удачи (если снова дубликат - снова прошу прощения, очень кривой коннект с мегафон-модема) |