Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.05.15;
Скачать: [xml.tar.bz2];

Вниз

ServerSocket dll MsSql странности...   Найти похожие ветки 

 
Katy   (2003-03-18 12:15) [0]

помогите плз

ситуация: нужно посылать оповешения пользователям на изменения данных в таблице 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-18 12:41) [1]

И где же в твоем коде вызов конструктора/деструктора объекта TMyClass ? Того самого, к которому ты обращаешься по ссылке, лежащей якобы в переменной MyClass ? Что-то не вижу я ничего похожего.

Назначать в кач-ве обработчика события у одного объекта метод несуществующего (!) объекта недопустимо - это нонсенс


 
Katy   (2003-03-18 12:48) [2]

пасибо.
совсем заработалась, щас попробую поправть.

но Listen то срабатывает тем не менее


 
Digitman   (2003-03-18 12:54) [3]

и это - более чем странно


 
Katy   (2003-03-18 13:16) [4]

грусно, но не помогло.
добавила:

в описанее класа в
public
constructor Create;
destructor Destroy; override;


constructor TMyClass.Create;
begin
end;

destructor TMyClass.Destroy;
begin
end;

и перед
ServerSocket1:=TServerSocket.Create(nil);
пишу MyClass:=TMyClass.Create;

так?

наверно все же не в этом дело, тем более, что аналогичная dll, вызываемая, из обычного приложения работает.


 
Katy   (2003-03-18 13:24) [5]

А принцип то правильный или можно по другому обьекту реакцию на события присвоить?


 
Digitman   (2003-03-18 13:26) [6]

предполодение - вызывающий код.поток не содержит цикла обработки оконных сообщений


 
Katy   (2003-03-18 13:36) [7]

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


 
Digitman   (2003-03-18 13:45) [8]


1. никак. кроме изучения исх.текста MS SQL
но по кр.мере можно проверить, в каком код.потоке ядро MS SQL вызывает ф-ции из твоей DLL. Выясни любым способом ID осн.код.потока процесса MS SQL и сравни с ID код.потока, в котором исполняется любая из твоих эксп.ф-ций (просто получи этот ID вызовом GetCurrentThreadId). Программно сравни. Если ID"ы различны, то ф-ция твоя вызывается процессом сервера в доп.код.потоке, который, скорей всего, не предусматривает ожидание/диспетчеризацию/обработку ок.сообщений.

2. Все, что ты делаешь, следует реализовать в своем собственном доп.кодовом потоке, в котором ты вольна реализовать недостающий цикл. См. класс TThread


 
Katy   (2003-03-18 14:30) [9]

создала поток

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 14:37) [10]

ну и где же у тебя работа с ServerSocket в теле Execute ?

p.s. TranslateMessage() необязателен


 
Katy   (2003-03-18 15:05) [11]

сори щас бооольшую глупость спрошу:
а какая должна быть там с ним работа?

и потом в этот цикл вообще не разу не зашли.


 
Polevi   (2003-03-18 15:09) [12]

для данной задачи лучше использовать другой способ
допустим есть некая 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 возвратит управления для всех ожидающих клиентов



 
Digitman   (2003-03-18 15:10) [13]

как это - какая ? все что ты делаешь с ServerSocket - все д.б. организовано в Execute() !


 
Katy   (2003-03-18 15:29) [14]

Polevi
да я читала статью
Сервис событий в SQL-сервере (Глеб Уфимцев)
http://www.sql.ru/articles/mssql/02040201AlertServiceForSQLserv.shtml
решение действительно красивое.

Digitman
я же извинилась :) Я правда не понимаю. Те в Execute я ловлю событие а как его в ServerSocket передать? Можно пример.


 
Digitman   (2003-03-18 15:46) [15]

его никак не надо передавать)

в Execute() нужно просто сделать все, что ты делала без Execute(), и после этого организовать цикл ожидания/диспетчеризации сообщений


 
Katy   (2003-03-19 07:23) [16]

Digitman
правильно ли я поняла, что просто запустив новый поток с этим циклом после создания обьекта TServerSocket я ситуацию не изменила. Те нужно именно в новом потоке создавать этот обьект.
Так?



 
Katy   (2003-03-19 07:40) [17]

Digitman
ОГРОМНОЕ СПАСИБО!
помогло :)


 
Digitman   (2003-03-19 08:15) [18]

да, правильно ты поняла.
не вдаваясь в подробности : новый код.поток - это собственно и есть то, что происходит в Execute()



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2003.05.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.014 c
4-47039
DeadMeat
2003-03-14 16:59
2003.05.15
Запуск приложений из сервиса


6-46887
Сергей М.
2003-03-17 09:39
2003.05.15
Подключение удаленного доступа


3-46641
Hedgehog
2003-04-24 16:49
2003.05.15
ADO ConnectionString


3-46596
Wedos
2003-04-14 08:50
2003.05.15
Задание min и max в DbChart


1-46738
Mishenka
2003-05-04 21:01
2003.05.15
Господа помогите, несоздаются компоненты :(((





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