Текущий архив: 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.52 MB
Время: 0.052 c