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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.051 c
2-1128532929
747
2005-10-05 21:22
2005.10.30
Текстовый квест - нужна помощь.


4-1123697468
DinoRay
2005-08-10 22:11
2005.10.30
Перехват функций Dll


1-1128670543
danilabagroff
2005-10-07 11:35
2005.10.30
OLE Error 800A03EC


1-1128437154
Aleksey
2005-10-04 18:45
2005.10.30
Error 217


1-1128414653
JohnKorsh
2005-10-04 12:30
2005.10.30
Прстейший вопрос по TBotton





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