![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ServerSocket dll MsSql странности...
Katy © (2003-03-18 12:15:00)помогите плз
ситуация: нужно посылать оповешения пользователям на изменения данных в таблице MsSql сеовера. Рассмотрев все варианты решила, написать dll на Delphi используя TServerSocket.
написала dll в которой на выходе 3 функции
создать сервер, убить сервер и послать мессагу (пока всем кто подключился)
dll вполне корректно работает, если её вызывать из обычной проги.
Заригистрила на MsSql сервере сервер создаеться и убиваеться вполне корректно. Причем даже клиенты его видять, те когда от клиента сообшение уходит ошибки не возникает. Но когда пытаюсь отправить сообшение с сервера на клиентов начинаються странности, почему-то оказываеться что конектов 0.
код dll лежит сдесь
http://www.sql.ru/forum/actualthread.aspx?bid=20&tid=25763
на том форуме пока молчат :(
Может у кого нибудь есть уже реализовывал подобную фичу. Может быть дело в настройках MsSql 2000 ?
Digitman (2003-03-19 08:15:00) [1]да, правильно ты поняла.
не вдаваясь в подробности : новый код.поток - это собственно и есть то, что происходит в Execute()
Katy (2003-03-19 07:40:00) [2]Digitman
ОГРОМНОЕ СПАСИБО!
помогло :)
Katy (2003-03-19 07:23:00) [3]Digitman
правильно ли я поняла, что просто запустив новый поток с этим циклом после создания обьекта TServerSocket я ситуацию не изменила. Те нужно именно в новом потоке создавать этот обьект.
Так?
Digitman (2003-03-18 15:46:00) [4]его никак не надо передавать)
в Execute() нужно просто сделать все, что ты делала без Execute(), и после этого организовать цикл ожидания/диспетчеризации сообщений
Katy (2003-03-18 15:29:00) [5]Polevi
да я читала статью
Сервис событий в SQL-сервере (Глеб Уфимцев)
http://www.sql.ru/articles/mssql/02040201AlertServiceForSQLserv.shtml
решение действительно красивое.
Digitman
я же извинилась :) Я правда не понимаю. Те в Execute я ловлю событие а как его в ServerSocket передать? Можно пример.
Digitman (2003-03-18 15:10:00) [6]как это - какая ? все что ты делаешь с ServerSocket - все д.б. организовано в Execute() !
Polevi (2003-03-18 15:09:00) [7]для данной задачи лучше использовать другой способ
допустим есть некая Extened Stored Proc (EPC), с ф-иями
function CreateWaitEvent;
var
evtHandle:THandle;
begin
evtHandle:=OpenEvent(EVENT_ALL_ACCESS,false,"MySuperEvent");
if evtHandle<>0 then
CloseHandle(evtHandle)
else
evtHandle:=CreateEvent(nil,true,false,"MySuperEvent");
end;
function Wait:integer;
var
evtHandle:THandle;
begin
evtHandle:=OpenEvent(EVENT_ALL_ACCESS,false,"MySuperEvent");
WaitForSinleObject(evtHandle,60000); //ждем 1 минуту
CloseHandle(evtHandle);
end
function Stop:integer;
var
evtHandle:THandle;
begin
evtHandle:=OpenEvent(EVENT_ALL_ACCESS,false,"MySuperEvent");
SetEvent(evtHandle);
ResetEvent(evtHandle);
CloseHandle(evtHandle);
end
есть StoredProc, типа
CREATE PROCEDURE GetMessage @R VARCHAR(512) OUTPUT
AS
EPC.CreateWaitEvent;
EPC.Wait;
SET @R=SELECT Msg FROM SomeTable
GO
CREATE PROCEDURE RaiseMessage @R VARCHAR(512)
AS
INSERT SomeTable (Msg) VALUES (@R)
EPC.Stop
GO
Если клиент хочет получать сообщения, он в доп кодовом потоке должен вызвать GetMessage - и заснет..
Если ктото вызовет RaiseMessage - сработает SetEvent и GetMessage возвратит управления для всех ожидающих клиентов
Katy (2003-03-18 15:05:00) [8]сори щас бооольшую глупость спрошу:
а какая должна быть там с ним работа?
и потом в этот цикл вообще не разу не зашли.
Digitman (2003-03-18 14:37:00) [9]ну и где же у тебя работа с ServerSocket в теле Execute ?
p.s. TranslateMessage() необязателен
Katy (2003-03-18 14:30:00) [10]создала поток
type
TWMThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
procedure TWMThread.Execute;
var
Mesg : TMsg;
begin
CreateFileTest("d:\temp\1.txt");
while GetMessage(Mesg,0,0,0) do
begin
CreateFileTest("d:\temp\2.txt");
TranslateMessage(Mesg);
DispatchMessage(Mesg);
end;
end;
в xpSSCreate запускаю поток
vWMThread:=TWMThread.Create(False);
файл 1.txt создаеться и тишина ... Клиент конектиться и все равно не 2.txt не ClientWrite.txt не возникают :(
Digitman (2003-03-18 13:45:00) [11]
1. никак. кроме изучения исх.текста MS SQL
но по кр.мере можно проверить, в каком код.потоке ядро MS SQL вызывает ф-ции из твоей DLL. Выясни любым способом ID осн.код.потока процесса MS SQL и сравни с ID код.потока, в котором исполняется любая из твоих эксп.ф-ций (просто получи этот ID вызовом GetCurrentThreadId). Программно сравни. Если ID"ы различны, то ф-ция твоя вызывается процессом сервера в доп.код.потоке, который, скорей всего, не предусматривает ожидание/диспетчеризацию/обработку ок.сообщений.
2. Все, что ты делаешь, следует реализовать в своем собственном доп.кодовом потоке, в котором ты вольна реализовать недостающий цикл. См. класс TThread
Katy (2003-03-18 13:36:00) [12]предположенеи интересное.
от сюда вопросы
1. как проверить
2. как выкрутиться
Digitman (2003-03-18 13:26:00) [13]предполодение - вызывающий код.поток не содержит цикла обработки оконных сообщений
Katy (2003-03-18 13:24:00) [14]А принцип то правильный или можно по другому обьекту реакцию на события присвоить?
Katy (2003-03-18 13:16:00) [15]грусно, но не помогло.
добавила:
в описанее класа в
public
constructor Create;
destructor Destroy; override;
constructor TMyClass.Create;
begin
end;
destructor TMyClass.Destroy;
begin
end;
и перед
ServerSocket1:=TServerSocket.Create(nil);
пишу MyClass:=TMyClass.Create;
так?
наверно все же не в этом дело, тем более, что аналогичная dll, вызываемая, из обычного приложения работает.
Digitman (2003-03-18 12:54:00) [16]и это - более чем странно
Katy (2003-03-18 12:48:00) [17]пасибо.
совсем заработалась, щас попробую поправть.
но Listen то срабатывает тем не менее
Digitman (2003-03-18 12:41:00) [18]И где же в твоем коде вызов конструктора/деструктора объекта TMyClass ? Того самого, к которому ты обращаешься по ссылке, лежащей якобы в переменной MyClass ? Что-то не вижу я ничего похожего.
Назначать в кач-ве обработчика события у одного объекта метод несуществующего (!) объекта недопустимо - это нонсенс