Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.07;
Скачать: CL | DM;

Вниз

ActiveForm и TserverSocket   Найти похожие ветки 

 
vav ©   (2008-05-22 18:51) [0]

Здравствуйте. Изучаю ActiveX. Цель: на html страницу поместить ActiveForm  который устанавливает канал связи с клиентом и получает данные.  Вначале создим ActiveForm и кладем компоненту ServerS    типа  TserverSocket  и пропишем в событии

procedure TActiveFormX.ServerSGetThread(Sender: TObject;
 ClientSocket: TServerClientWinSocket;   var SocketThread: TServerClientThread);
Begin
  SocketThread := TD_ServerThread.Create(False, ClientSocket);
 Edit1.Text:= "  GetThread: RemoteHost "+ " (" +   ClientSocket.RemoteAddress + ")";
End;
Клиент подключается поток создается, но не выполняется почему?
Если сделать простым приложением то все работает
Может быть в потоке что-то не создал для ActiveX?
  type
 EServerThread = class( Exception );  
 
TD_ServerThread = class(TServerClientThread)
 private
 Stream  : TWinSocketStream;  
  s2: string;
 public
   procedure ClientExecute; override;
    procedure AddRecord;
 end;

procedure TDbServerThread.ClientExecute;
begin
  inherited FreeOnTerminate := true;

 Stream := TWinSocketStream.Create(ClientSocket, 5000);
try
while not Terminated and ClientSocket.Connected do

     try
    ……… ……..
    Buffer := "";  SetLength(Buffer,nn);
   дальше работаем с полученными данными
    ………………………
    except on e:exception do     begin    ClientSocket.Close;  Terminate;  end;    
    end;  

 finally
                 begin     Stream.Free;  ClientSocket.Close;    Terminate;       end;  
 end;

end;


 
Сергей М. ©   (2008-05-22 19:19) [1]


> поток создается, но не выполняется


Врать не есть хорошо.


 
Сергей М. ©   (2008-05-22 19:23) [2]


>  finally
>                  begin     Stream.Free;  ClientSocket.Close;
>     Terminate;       end;  
>  end;


Эт чиво такое ?
Контрольный в голову что ли ?)


 
vav ©   (2008-05-22 20:06) [3]

дело в том, что форма (ActiveX) отображается на html странице.
Нажимаю кнопку активизируя сервер на компоненте TserverSocket
срабатывает ServerSGetThread (т е подключился клиент),
создается поток SocketThread (отображается на Edit1.Text),
дальше , повидимому, не вызывается TDbServerThread.ClientExecute
Поток как бы застывет и обработка данных не происходит
Хотя  в простом приложении все работает
в потоке происходит прием данных идальше отображаются на форме
Наверное поток созданный TserverSocket и форма (ActiveX) ни как между
собой не взаимодействуют а вот где?

>  finally
>                  begin     Stream.Free;  ClientSocket.Close;
>     Terminate;       end;  
>  end;

>>Эт чиво такое ?
>>Контрольный в голову что ли ?)

а это  ..
html страница у меня  Access Violation


 
Сергей М. ©   (2008-05-22 20:34) [4]


> дальше , повидимому, не вызывается TDbServerThread.ClientExecute


На чем же основаны эти умозаключения ? Исключительно на "видимости" ?
В таком случае тебе в чукчи ("что вижу, то и пою"), а не в программисты.

Есть встроенный отладчик - на его информации следует полагаться, в 1-ю очередь, а не на "интуицию".


> html страница у меня  Access Violation


Угу.

А в справке так и написано, мол, ежели у вас "html страница Access Violation", то немедля вызывайте Terminate ..

Угадал ?


 
Сергей М. ©   (2008-05-22 20:44) [5]


> procedure TDbServerThread.ClientExecute;
> begin <- СЮДА ставишь брейкпойнт и убеждаешься в необоснованности своего "полагаю"
>   inherited FreeOnTerminate := true; <- ЭТОТ бред убери и никому больше не показывай


 
vav ©   (2008-05-23 14:55) [6]

Наверное я неправильно объяснил, итак все попорядку мои действия
Создаем в Delphi7
File- New – other – ActiveX -  выбираем ActiveForm
Выбираю ThreadingModel = Apartment   Опции включены
На форму кладем  Edit1, Button1 и TserverSocket ( ServerType = stThreadBlocking, Port=666)

unit AF_Impl1;

{$WARN SYMBOL_PLATFORM OFF}
interface
------- вырезано -----------------------------------
type
 TAF_X = class(TActiveForm, IAF_X)
   Button1: TButton;
   Edit1: TEdit;
   ServerS: TServerSocket;
------- вырезано -----------------------------------
public
   { Public declarations }
   procedure Initialize; override;
   procedure vviv(tt:string);
 end;
 
var
 ff: TAF_X;
 
  implementation
uses ComObj, ComServ, About1;

//Дальше создаем потомока от TServerClientThread
type
 
EServerThread = class( Exception );
    TD_ServerThread = class(TServerClientThread)
 private
 Stream  : TWinSocketStream;  
 strCommand: string;    
public
   procedure ClientExecute; override;
   procedure Log;
 end;

{ TD_ServerThread }

procedure TD_ServerThread.ClientExecute;
var
RcvBuf     : array[0..255] of Byte;
 Buffer, s1,c_ctroka,strIn: string;
 nRead: Integer;
 vv:boolean;

begin

//   inherited FreeOnTerminate := true; <- ЭТОТ бред убери и никому больше не показывай
убрал

StrCommand:="запуск";
  Synchronize(Log);

try
  Stream := TWinSocketStream.Create(ClientSocket, 100000);

   try
     while ( not Terminated ) and ( ClientSocket.Connected ) do
     try
     repeat
      vv:=false;

       nRead := Stream.Read(Buffer[1],256 );
       if nRead = 0 then begin ClientSocket.Close; Break;    end;

      SetLength (Buffer, nRead);
      s1:= Buffer;

       if (Pos(#10#13"."#10#13, Buffer) > 0) then
                     begin
                      c_ctroka:= c_ctroka + Copy (Buffer, 1, Pos (#10#13"."#10#13, Buffer) -1);
                        vv:=true;//выход из цикла
                      end
                      else c_ctroka:= c_ctroka + Buffer;

     until vv;

         StrCommand:=c_ctroka;
             Synchronize(Log); //3 показывает что принято сервером StrCommand

       //отправить клиенту результаты обратно
                  strIn := "OK!";
           Stream.Write( strIn[1], Length (strIn));
           

     except on e:exception do
       begin
         // Если произошла ошибка, то закрываем сокет и выходим
         ClientSocket.Close;
         Terminate;
       end;
     end;
   finally
     Stream.Free;
   end;
 except on e:exception do
   begin
     // Если произошла ошибка, то закрываем сокет и выходим
     ClientSocket.Close;
     Terminate;
   end;
 end;

    //  показывает что принято сервером StrCommand
        Synchronize(Log);

end;

procedure TD_ServerThread.Log;
begin
    ff.vviv( strCommand);

end;

Также добавил
procedure TActiveFormX.ServerSGetThread(Sender: TObject;
 ClientSocket: TServerClientWinSocket;   var SocketThread: TServerClientThread);
Begin
  SocketThread := TD_ServerThread.Create(False, ClientSocket);
 Edit1.Text:= "  GetThread: RemoteHost "+ " (" +   ClientSocket.RemoteAddress + ")";
End;

procedure TAF_X.vviv(tt: string);
begin
  Edit1.Text:=tt;
end;

procedure TAF_X.Button1Click(Sender: TObject);
begin
  ServerS.Active:=true;
end;
дальше
компилируем
регисрируем AF_Proj1.ocx  в реестре (Register Activex Server)
создаем html страницу
<HTML>
<H1> ACTIVEX  </H1>
<OBJECT
classid="clsid:C917F481-4B84-4F2A-A59B-74DEC32A8C28"
  width=350
  height=250
  align=center
  hspace=0
  vspace=0

</OBJECT>

</HTML>
открываем в Internet Explorer
Сервер запускается Отображается ‘GetThread: RemoteHost  1.1.1.1’ т. е. Клиент подключился, а дальше без изменений

<<На чем же основаны эти умозаключения ? Исключительно на "видимости" ?
<<В таком случае тебе в чукчи ("что вижу, то и пою"), а не в программисты.
Я бы с выводами не спешил на твоем месте , а если есть желание то
помог бы  

> begin <- СЮДА ставишь брейкпойнт и убеждаешься в необоснованности >своего "полагаю"
Поток не передает данные на Форму
Помочь советом можеш как лучше поступить в этой ситуации
P.S. Сейчас читаю статью “Понимание потоковых моделей в COM при программировании на Delphi”


 
ага0   (2008-05-27 19:09) [7]

2 vav ©

Synchronize выкинь нахвиг, замени на че-нить типа Sendmessage


 
Сергей М. ©   (2008-05-27 20:19) [8]


> Сейчас читаю статью “Понимание потоковых моделей в COM


Какие тебе нафих "потоковые модели", еслим ты не умеешь пользоваться встроенным в средк Делфи отладчиком..

Ты полез в дебри не зная элементарных основ отладки программ, созданных в среде, которую ты выбрал для разработки.


> ServerSGetThread(


> Edit1.Text:=


Уж сколько раз твердили миру - НЕЛЬЗЯ обращаться в визуальным VCL-контролам в дополнительном потоке процесса приложения, использующего VCL !


> Я бы с выводами не спешил на твоем месте


Я их сделал вовремя, и ты подтвердил это.


> Поток не передает данные на Форму


Да ? А куда поток, по-твоему, тычет ЭТО


> Edit1.Text:= "  GetThread: RemoteHost "+ " (" +   ClientSocket.
> RemoteAddress + ")";


?
На луну ?


 
Сергей М. ©   (2008-05-27 20:20) [9]

Если ты не понимаешь, как работает synchronize, то и нечего было тыкать его вызов куда ни попадя.


 
vav ©   (2008-05-30 15:20) [10]

Я вообщето не программист но работа обязывает.
Большое спасибо что вы не промолчали
Все ваши ответы мне помогли
 Synchronize(Log);
Оставил в конце нити
все проверки  в потоке убрал
оставил одну
 finally
    Stream.Free;
  end;
Принятые данные с потока передаются
на форме через synchronize данные не отображаются
пошел другим путем через таймер

В Итоге на рабочем столе Серером данные принимаются и
отображаются через ативеХ
и могут находится под иконкой  
что и хотел :)



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

Текущий архив: 2010.02.07;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.011 c
1-1236591988
Sha
2009-03-09 12:46
2010.02.07
Странное поведение якорей TPanel+TEdit+Anchors


2-1259775521
Alik
2009-12-02 20:38
2010.02.07
Утечка памяти


15-1259631921
brother
2009-12-01 04:45
2010.02.07
Far и команда Noop


15-1259607148
korabok
2009-11-30 21:52
2010.02.07
Как определить что активное приложение - игровое?


2-1260531371
alex ford
2009-12-11 14:36
2010.02.07
закинуть в ресурсы файлы