Que pena molestarte, pero es que necesitamos solucionar el tema de los servicios, hay que crear un servicio que haga una tarea especifica sobre la base de datos, compilamos este ejemplo y funciona, pero en el ejemplo, la tarea del servicio es escribir la hora en un archivo de texto cada 1 segundo.
El problema que se nos presenta es que en todas las ocasiones, el tiempo de ejecución de la consulta toma mas de un segundo, un tiempo indeterminado, que no conocemos, la idea es poder pausar el servicio mientras ejecutamos la tarea y luego si reiniciar la tarea.
No se si se pueda pausar el sleep o el servicio, o si podemos agregar un TIMER, que sabemos que si se puede pausar.
if (InitService() == 0)
{
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hStatus, &ServiceStatus);
// Aquí va el bucle principal del servicio
while (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
{
// Realiza las tareas del servicio
hb_vmPushSymbol( hb_dynsymSymbol( hb_dynsymFindName( "TRABAJOSERVICIO" ) ) );
hb_vmPushNil();
hb_vmDo( 0 );
Sleep(1000); //COMO PAUSAMOS ESTE SLEEP?
}
}// Once you build the EXE open a CMD window as Administrator, then:
// sc create servicio binPath=C:\fwh64_2501\samples\servicio.exe
// sc start servicio
// when you want to stop it: sc stop servicio
// when you want to remove it: sc delete servicio
// DON'T USE ANY GUI FROM IT !!!
#include "FiveWin.ch"
function Main()
Servicio()
return nil
function TrabajoServicio()
if ! File( "C:\fwh64_2501\samples\servicio.txt" )
memoWrit( "C:\fwh64_2501\samples\servicio.txt", Time() )
else
memoWrit( "C:\fwh64_2501\samples\servicio.txt", memoRead( "C:\fwh64_2501\samples\servicio.txt" ) + CRLF + Time() )
endif
return nil
#pragma BEGINDUMP
#include <windows.h>
#include <tchar.h>
#include <hbvm.h>
SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hStatus;
void ServiceMain(int argc, char** argv);
void ControlHandler(DWORD request);
int InitService( void );
HB_FUNC( SERVICIO )
{
SERVICE_TABLE_ENTRY ServiceTable[2];
ServiceTable[0].lpServiceName = _T("Servicio");
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL;
StartServiceCtrlDispatcher(ServiceTable);
}
#pragma warn -8057
void ServiceMain(int argc, char** argv )
{
ServiceStatus.dwServiceType = SERVICE_WIN32;
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
hStatus = RegisterServiceCtrlHandler(_T("Servicio"), (LPHANDLER_FUNCTION)ControlHandler);
if (InitService() == 0)
{
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hStatus, &ServiceStatus);
// Aquí va el bucle principal del servicio
while (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
{
// Realiza las tareas del servicio
hb_vmPushSymbol( hb_dynsymSymbol( hb_dynsymFindName( "TRABAJOSERVICIO" ) ) );
hb_vmPushNil();
hb_vmDo( 0 );
Sleep(1000); //COMO PAUSAMOS ESTE SLEEP
}
}
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hStatus, &ServiceStatus);
}
void ControlHandler(DWORD request)
{
switch(request)
{
case SERVICE_CONTROL_STOP:
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hStatus, &ServiceStatus);
MessageBox( 0, "service stopped", "ok", 0 );
return;
case SERVICE_CONTROL_SHUTDOWN:
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hStatus, &ServiceStatus);
return;
default:
break;
}
SetServiceStatus(hStatus, &ServiceStatus);
}
int InitService()
{
// Inicialización del servicio
return 0;
}
#pragma ENDDUMPLEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com
[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]