На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Обязательно указание:
1) типа базы данных (Paradox/Oracle/Interbase и т.п.)
2) способа доступа к базе данных (ODBC/ADO/DAO/BDE и т.п.)
Например: Paradox/BDE, MS Access/ADO

Наиболее часто задаваемые вопросы:
Базы даных для начинающих. Первые шаги. Понятие о BDE.
Переход на клиент-сервер и начала ADO
Приёмы работы с BLOB (OLE/Memo) полями
Запросы и параметры или как избавиться от многих проблем. Проблемы с датами в запросах.
Нужели мне нужно устанавливать BDE? (или почему не работает программа на другом компьютере)
Модераторы: Bas, Rouse_
  
> Обмен данными между приложениями , Возможно ли организовать через систему событий?
    Грубо говоря, клиент и сервер терзают через ODBC Acsess·овскую БД. Может ли компонент, скажем, TDatabase из одного приложения каким-нибудь Event·ом понять, что в базу внесены изменения?
      Может. См. CreateEvent()
        Цитата Relaxander @
        Может. См. CreateEvent()

        А подробней можно?
          так а что нужно-то? чтобы одно приложение узнало, что другое что-то изменило в БД?
          тут есть варианты.
          1. Читатель периодически опрашивает нужное место бд на предмет изменений
          2. Писатель извещает читателя путем посылки сообщения (именованный канал, сокеты, MMF, ...)
          3. Читатель запускает поток, в котором ждет созданный в обоих приложениях Mutex или Event - WaitForSingleObject (вернее, созданный в одном и открытый в другом).
          Писатель после изменения меняет статус объекта синхронизации, в результате чего читатель снимается с ручника и узнает об изменениях.
          ... придумайте сами

          А вообще зависит от глобальной постановки задачи - чего в итоге нужно добиться. Возможно, есть более простой и красивый способ
              Может. См. CreateEvent()
              То есть штатных событий не предусмотрено?

              так а что нужно-то? чтобы одно приложение узнало, что другое что-то изменило в БД?
              Ну да. Я вот периодически и опрашиваю, но имхо это и не просто и не красиво :( к п.3 Нужно каким-то образом оформить поток? А то у меня его читатель все равно не видит...

              Добавлено
              Профиль · PM
              Рейтинг (т): [ 131 ] http://www.cromis.net/blog/downloads/cromis-ipc/
              Не хотел бы пользоваться сторонними пакетами
                Цитата rdx0 @
                Нужно каким-то образом оформить поток?


                Писатель

                ExpandedWrap disabled
                  hEvent := CreateEvent(nil, TRUE, FALSE, 'Global\DBChangeEvent');
                   
                  MakeChangesInDB();
                  PulseEvent(hEvent);

                Читатель

                ExpandedWrap disabled
                  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;
                Сообщение отредактировано: Relaxander -
                  Пока не все понял, но благодарю за поддержку - с утра попробую. Немного настораживает while.. Я не считаю себя специалистом, но предполагал, что если событие произошло - обработал и забыл. Я не прав?
                    Цитата rdx0 @
                    если событие произошло - обработал и забыл

                    именно так. Потом опять упираемся в WaitForSingleObject и ждем следующего события
                      WaitForSingleObject - это WinApi?
                        Цитата rdx0 @
                        WaitForSingleObject - это WinApi?

                        да, но можно и дельфийский класс юзать
                        http://www.sql.ru/forum/1070223/sinhroniza...moshhu-event-ov
                          Благодарю, снова понял процентов 40 )) Выходные пройдут в сосредоточенном курении мануалов

                          Добавлено
                          while уже не настораживает - выходные начинаются с удачи (если снова дубликат - снова прошу прощения, очень кривой коннект с мегафон-модема)
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0381 ]   [ 16 queries used ]   [ Generated: 6.05.24, 08:43 GMT ]