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

Вниз

Как запустить приложение без формы?   Найти похожие ветки 

 
beglec   (2005-10-07 04:31) [0]

Как запустить приложение без формы?
Требуется что бы приложене работало с Sockets без вызова форм.

Понимаю что вопрос дурацкий, но хотелось бы знать ответ. желательно ответ писать на мыло.


 
Digitman ©   (2005-10-07 07:58) [1]


> Требуется что бы приложене работало с Sockets без вызова
> форм


сокетам для работы не нужны никакие формы


 
Гриха ©   (2005-10-07 08:14) [2]

form1.visible=false;
Формы  на экране идно не будет. Наверняка, есть способ лучше, но я этим пользуюсь.


 
MBo ©   (2005-10-07 08:20) [3]

Один из способов:
File-New-Other-Console Application
создается проект, из которого стираешь строчку {$APPTYPE CONSOLE}


 
andrexa ©   (2005-10-07 08:58) [4]

тебя сокет- клиент интересует?
тогда вот (откопал в старых исходниках)
unit BlckSock;

interface
uses
 Windows,  WinSock2,    SysUtils, Debug_functions;
type
 TSimpleEvent = procedure() of object;

 TClientSocket = class(TObject)
 private
   FSocket : TSocket;
   FOnRead, FOnConnect, FOnClose : TSimpleEvent;
   FHost, ABuffer : string;
   FPort : word;
   FConnected, FConnecting : boolean;
   WSA_Data: TWSAData;
   FSockAddrIn : TSockAddrIn;
   FLastError : dword;
 public
   constructor Create();
   destructor Destroy();

   function Connect() : boolean;
   procedure Close(bEvent : boolean);

   function SendBuf(var Buf; Count: Integer): Integer;
   function SendText(const S: string): Integer;
   function ReceiveBuf(var Buf; Count: Integer): Integer;
   function ReceiveText: string;
   function ReceiveLine: string;

   procedure DoLoop();

   property Host : string read FHost write FHost;
   property Port : word read FPort write FPort;
   property Socket : TSocket read FSocket write FSocket;
   property Connected : boolean read FConnected write FConnected;
   property Connecting : boolean read FConnecting write FConnecting;

   property LastError : dword read FLastError write FLastError;

   property OnRead : TSimpleEvent read FOnRead write FOnRead;
   property OnConnect : TSimpleEvent read FOnConnect write FOnConnect;
   property OnClose : TSimpleEvent read FOnClose write FOnClose;

 public
   hThread   : dword;
   ThreadId  : dword;

 end;

implementation

uses GlobalVariable;

var
 Blocking : dword = 0;

Procedure LoopSct(ClientSocket : TClientSocket);
begin
 {$IFDEF DEBUG}
     StrToLog ("ClientSocket.DoLoop();");
 {$ENDIF}

 ClientSocket.DoLoop();
 {$IFDEF DEBUG}
     StrToLog ("Loop breaking");
 {$ENDIF}
 CloseHandle (ClientSocket.hThread);
 ClientSocket.hThread:=0;
 ExitThread (0);
end;

function Resolve(S : string) : dword;
var
 HostEnt : PHostEnt;
begin
 Result:=Inet_Addr(PChar(S));
 if (Result = 0) or (Result = MAXDWORD) then
   begin
     HostEnt:=GetHostByName(PChar(S));
     if (HostEnt <> nil) then
       Result:=LongInt(PLongInt(HostEnt^.h_addr_list^)^)
     else
       Result:=0;
   end;
end;

{ * TClientSocket * }

constructor TClientSocket.Create();
begin
 inherited;

 FSocket:=DWORD(INVALID_SOCKET);
 FConnected:=false;
 WSAStartup($0202, WSA_Data);

 hThread  :=0;
 ThreadId :=0;
end;

destructor TClientSocket.Destroy();
var ECode : dword;
begin
 if FConnected then
   Close(true);

 WSACleanup();
 GetExitCodeThread (hThread,ECode);
 if (ECode>0) and (ECode<>STILL_ACTIVE) then  CloseHandle (hThread);
 inherited;
end;

procedure TClientSocket.DoLoop();
var
 FDSet : PFDSet;
 ErrorCode  : Integer;
 Count      : u_long;
begin
 New(FDSet);
 FD_ZERO(FDSet^);
 FD_SET(FSocket, FDSet^);
 while true do
   begin
     ErrorCode:=Select(0, FDSet, nil, nil, nil);
     if (ErrorCode = SOCKET_ERROR) then
       break
     else
       begin
         IoCtlSocket(FSocket, FIONREAD, Count);
         if (Count > 0) then
           begin
             if Assigned(FOnRead)and FConnected then
                begin
                 StrToLog ("[UNIT BlckSock] EnterCriticalSection(lpCrtlSctn); OnRead();");
                 EnterCriticalSection(lpCrtlSctn);
                 StrToLog ("[UNIT BlckSock] IN CriticalSection(lpCrtlSctn); OnRead()!!!!!");
                 //обработка
                 OnRead();
                 StrToLog ("[UNIT BlckSock] LeaveCriticalSection(lpCrtlSctn);/OnRead();");
                 LeaveCriticalSection(lpCrtlSctn);
                 StrToLog ("[UNIT BlckSock] LeaveCriticalSection(lpCrtlSctn); /OnRead();");
                end;
           end
         else
           break;
         Count:=0;
       end;
   end;

 StrToLog ("[UNIT BlckSock] EnterCriticalSection(lpCrtlSctn); Close(true);");
 EnterCriticalSection(lpCrtlSctn);
 StrToLog ("[UNIT BlckSock] IN CriticalSection(lpCrtlSctn); Close(true);!!!!!");
 Self.Close(true);
 StrToLog ("[UNIT BlckSock] LeaveCriticalSection(lpCrtlSctn);/Close(true);");
 LeaveCriticalSection(lpCrtlSctn);  Dispose (FDSet);
 StrToLog ("[UNIT BlckSock] LeaveCriticalSection(lpCrtlSctn); /Close(true);");end;

procedure TClientSocket.Close(bEvent : boolean);
var
 lin: TLinger;
 linx: array [0..3] of Char absolute lin;
begin
 if (FSocket <> INVALID_SOCKET) then begin
     Shutdown(FSocket, 2);  // SD_SEND
     lin.l_onoff:=1;
     lin.l_linger:=1;
     SetSockOpt(FSocket, SOL_SOCKET, SO_LINGER, linx, SizeOf(Lin));
     CloseSocket(FSocket);
     FSocket:=DWORD(INVALID_SOCKET);
     FConnected:=false;
     end;
 if Assigned(FOnClose) and bEvent then
     OnClose();
end;

function TClientSocket.Connect() : boolean;
var
 ErrorCode : Integer;
begin
 Result:=false;
 FConnecting:=true;
 Close(false);
 FSockAddrIn.sin_family:=AF_INET;
 FSockAddrIn.sin_port:=htons(FPort);
 FSockAddrIn.sin_addr.S_addr:=Resolve(FHost);
 {$IFDEF DEBUG}
     StrToLog ("FSocket:=Winsock2.Socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);");
 {$ENDIF}

 FSocket:=Winsock2.Socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 {$IFDEF DEBUG}
     StrToLog ("OK");
 {$ENDIF}
 if FSocket = SOCKET_ERROR then
   begin
     FLastError:=WSAGetLastError();
     FConnecting:=false;
     exit;
   end;

 IoCtlSocket(FSocket, FIONBIO, u_long(Blocking));
 ErrorCode:=Winsock2.Connect(TSocket(FSocket), @FSockAddrIn, SizeOf(FSockAddrIn));
 FConnected:=(ErrorCode = 0);

 if FConnected then
   begin
    if Assigned(FOnConnect) then begin
      OnConnect();
      hThread:=BeginThread (nil,4*1024*1024,@LoopSct,Pointer(Self),0,ThreadId);
 {$IFDEF DEBUG}
     StrToLog ("hThread:=BeginThread (0,0,@LoopSct,Pointer(Self),0,ThreadId);");
 {$ENDIF}
      end;
   end
 else begin
   Close(true);
   end;

 FConnecting:=false;
 Result:=FConnected;
 sleep (50);
end;

function TClientSocket.SendBuf(var Buf; Count: Integer): Integer;
begin
 Result:=Send(FSocket, Buf, Count, 0);
end;

function TClientSocket.SendText(const S: string): Integer;
begin
 Result:=SendBuf(Pointer(S)^, Length(S));
end;

function TClientSocket.ReceiveBuf(var Buf; Count: Integer): Integer;
begin
 Result:=0;
 if (Count = -1) then
   IoctlSocket(FSocket, FIONREAD, u_long(Result))
 else
   if Count > 0 then
     begin
       Result:=Recv(FSocket, Buf, Count, 0);
       if Result = SOCKET_ERROR then
         begin
           FLastError:=WSAGetLastError();
           Result:=0;
         end;
     end;
end;

function TClientSocket.ReceiveText: string;
begin
 SetLength(Result, ReceiveBuf(Pointer(nil)^, -1));
 SetLength(Result, ReceiveBuf(Pointer(Result)^, Length(Result)));
end;

function TClientSocket.ReceiveLine: string;
var
 I : dword;
begin
 Result:=""; ABuffer:=ABuffer + ReceiveText();
 if (Trim(ABuffer) <> "") then
   begin
     if (ABuffer[1] = #13) then
       Delete(ABuffer, 1, 2);

     I:=Pos(#13#10, ABuffer);
     if I > 0 then
       begin
         Result:=Copy(ABuffer, 1, I - 1);
         Delete(ABuffer, 1, I + 1);
       end;
   end;
end;

end.


 
beglec   (2005-10-07 14:22) [5]

так и знал что вопрос поставил не корректно.
Сокеты работает замечательно, обрабатываются нормально.


 Application.Initialize;
 Application.CreateForm(TDataModule1, DataModule1);
 Application.Run;


программа работает и обрабываются сокеты


 Application.Initialize;
 Application.Run;


В вот так сразу же приложение заканчивает работать.

как сделать так что бы приложение завершало работу, а обрабатывала сокеты

Делаю так

 Application.Initialize;
 Application.Run;
 While Quit do Application.ProcessMessages;

в этом случает все работает, но приложение занимает 25-50% процессорного времени. А мне бы хотелось что бы приложение работает только по событие на Sockets но при этом не завершало свою работу.
О как. Вроде теперь понял сам что написал.


 
beglec   (2005-10-07 14:23) [6]

* как сделать так что бы приложение НЕ завершало работу, а обрабатывала сокеты


 
Digitman ©   (2005-10-07 14:31) [7]


> сразу же приложение заканчивает работать


потому что MainForm = nil , ибо она отсутствует у тебя напрочь... а это - одно из главных условий продолжения/прерывания работы цикла, реализованного в методе Run()

Так чем же тебе не нравится такой вариант :

Application.Initialize;
Application.CreateForm(TDataModule1, DataModule1); // DataModule1 , коль он создан первым, стал фигурировать как MainForm !
Application.Run;

?

он у тебя же работает, как ты утверждаешь !

ну работает себе и работает - зачем трудности-то искать ? поясни ...


 
y-soft ©   (2005-10-07 14:37) [8]

>beglec   (07.10.05 14:23) [6]

Раз уж Вам формы не нужны, то зачем Вам вообще эти строчки?

Application.Initialize;
Application.Run;


Последуйте совету MBo ©   (07.10.05 08:20) [3] и не заморачивайтесь


 
!Trinix ©   (2005-10-07 16:10) [9]

Вы что в паскале не работали?!
Удаляете
Application.CreateForm(TDataModule1, DataModule1);
и пишите дальше.
Или вообще можно писать весь код сразу в модуле проекта - так гораздо лучше!


 
!Trinix ©   (2005-10-07 16:11) [10]

Удалено модератором


 
-=S..S=-   (2005-10-07 16:33) [11]

while application.termenated=false do
begin
getmessage()
dispathmessage()
application.processmessage
end;


 
y-soft ©   (2005-10-07 16:46) [12]

>-=S..S=-   (07.10.05 16:33) [11]

В простейшем случае можно и вообще без цикла обработки сообщений :)

InitResources;

try
 while True do
 begin
     if not DoSomeWork then
       break;
 end;
finally
 ReleaseResources;
end;


 
-=S..S=-   (2005-10-07 17:07) [13]


> y-soft ©   (07.10.05 16:46) [12]
>
>


Можно ... но при таком коде посмотришь на загрузку своего процессора :)
хотя я не знаю что делает функция DoSomeWork  .. если в ней есть что то типа sleep то тогда всё будет ок .. иначе ниже 100% загрузки не будет ) . мне так кажеться поправте если я не прав


 
y-soft ©   (2005-10-07 18:08) [14]

>-=S..S=-   (07.10.05 17:07) [13]

мне так кажеться

Спасибо за наблюдательность - правильно кажется - это всего лишь скелет.

Задержка в DoSomeWork подразумевается. Просто она ведь может быть выполнена и без Sleep(), так например (опять скелет!):


 if WaitForXXXXXX(..., SleepPause) = .... then
    Result := Work();


Равно, как подразумевается и возможность принудительного выхода из цикла по внешнему воздействию (ну не через TerminateProcess же завершать :) )

Т.е. правильнее, конечно, было бы написать так:

InitResources;

try
while not NeedTerminate() do
    if DoSomeWork() then
      DoSleep(...)
    else
      break;
finally
ReleaseResources;
end;


P.S. Я потому и смайлик поставил, что ожидал таких замечаний :)


 
simpson ©   (2005-10-07 18:25) [15]

Чем сервис не устраивает?


 
Leonid Troyanovsky ©   (2005-10-07 18:30) [16]


> y-soft ©   (07.10.05 18:08) [14]

> P.S. Я потому и смайлик поставил, что ожидал таких замечаний
> :)


По широте душевной я добавлю еще одно.
Вообще-то, автор вопроса, видимо, ожидал, что ему предложат некое
заклинание, которое заставит, например, асинхронные функции сокетов
работать без окна (т.е., без формы).

Но, наука доказала, что чудес-то вовсе нет.
Все, в чем нуждался многострадальный автор, это, видимо,
Application.ShowMainForm := False,
вставленное хоть в ейную OnCreate.

И более никаких приседаний не требуется, тем более, что
написанные предлагаемым способом приложения имеют
проблемы со своим завершением, т.е., они лишены
радости реагировать на всякие WM_QUERYENDSESSION и
даже простой CTRL_LOGOFF_EVENT им уже не доступен.

--
Regards, LVT.


 
y-soft ©   (2005-10-07 19:34) [17]

>Leonid Troyanovsky ©   (07.10.05 18:30) [16]

За душевную широту спасибо - нечастое это сейчас явление :)

Возможно автору вопроса действительно только и надо, что выставить

Application.ShowMainForm := False

Но появились некоторые вопросы.

Например:

Где в сабжевом вопросе конкретно сказано, что речь идет о именно о модели WSAAsyncSelect?

Что говорит наука о модели WSAEventSelect или о сокетах, созданных с флагом WSA_FLAG_OVERLAPPED (ну и соответственно о функции WSAWaitForMultipleObjects)?

Насчет WM_QUERYENDSESSION и CTRL_LOGOFF_EVENT тоже не все так однозначно безнадежно, учитывая, что многопоточным приложение никто делать не запрещал...

P.S. Ничего личного :)


 
beglec   (2005-10-08 14:07) [18]

Всем спасибо
:)
Form1.Visible:=False; это я знаю.

TForm подключает кучу библиотек
просто хотел одним ударом большинство библиотек убрать :)

так сказать сократить exe файл.
если нет формы то зачем изличшнее тянуть в себе :)

еще раз всем спасибо



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

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

Наверх




Память: 0.53 MB
Время: 0.075 c
1-1128523688
X9
2005-10-05 18:48
2005.10.30
Работа с TXMLDocument и IXMLNode


2-1128744905
intel
2005-10-08 08:15
2005.10.30
работа с Excel


14-1128611218
Piter
2005-10-06 19:06
2005.10.30
Лекция в одном институте по теме "Интернет"


14-1129023775
Igorek
2005-10-11 13:42
2005.10.30
Аппаратный месенджер


8-1117885721
Dr. Andrew
2005-06-04 15:48
2005.10.30
Как "перехватить" и сохранить wav от звуковой карты?