El modo Singleton se usa para restringir solo un objeto de una determinada clase en el proceso. ), si las llegadas generan un hilo, pero si se alcanza otro reloj antes de que este hilo complete su tarea, puede generar múltiples hilos para ejecutar la tarea, lo que resulta en confusión, así que considere usar el modo Singleton para resolver este problema (por supuesto, hay otros soluciones.
El código central es el siguiente:
// unidad de temporizador
Procedimiento tservice1.timer_maintimer (remitente: tobject);
varilla
MyStringList: tStringList;
SearchRec: tsearchRec;
ahora tiempo: cadena;
Comenzar
intentar
DatTimeToString (ahora tiempo, 'HH: nn', ahora);
Si LeftStr (ahora tiempo, 4) = LeftStr (getMsg ('Juego', 'Tiempo de emisión', TheExeName+'. Ini'), 4) entonces entonces
Comenzar
// crear un hilo de envío
Global_instance: = tsendthread.getInstance;
/////////////////////////////
fin;
excepto
En E: Excepción DO
Comenzar
myStringList: = tStringList.create;
Si FileExists (ExtractFilePath (Paramstr (0))+'Err.txt') entonces
myStringList.LoadFromFile (ExtractFilePath (paramstr (0))+'err.txt');
myStringList.Add ('('+DatuTimeToStr (ahora)+') [Error creando hilo:]'+e.message);
myStringList.Savetofile (ExtractFilePath (Paramstr (0))+'Err.txt');
MyStringList.Free;
Si findFirst (ExtractFilePath (paramstr (0))+'err.txt', faanyfile, searchRec) = 0 entonces
Comenzar
Si searchRec.size> 5000000 entonces
Comenzar
RenameFile (ExtractFilePath (Paramstr (0))+'Err.txt', AnsirePlAcestr (ExtractFilePath (Paramstr (0))+'Err.txt', '. Txt', FormatDateTime ('yyyyy-mm-dd hh-mm-sss ', ahora)+'. txt '));
fin;
fin;
fin;
fin;
fin;
// Unidad de hilo
unidad unit_send;
interfaz
usos
Sysutils, clases, strutils, main;
tipo
Tsendthread = class (tthread)
público
constructor create (createSoSpended: boolean);
Destructor destruir;
Función de clase GetInstance: tsendthread;
broma de procedimiento;
protegido
procedimiento ejecutar;
fin;
varilla
Global_Instance: tsendthread;
Implementación
usa db;
función de clase tsendthread.getInstance: tsendthread;
Comenzar
Si global_instance = nil entonces
Comenzar
Global_instance: = tsendthread.create (falso);
fin;
Resultado: = Global_Instance;
fin;
constructor tsendthread.create (createSoSpended: boolean);
Comenzar
Si global_instance = nil entonces
Comenzar
create heredado (createSoSpended);
FreeOnterminate: = True;
fin
demás
Levante la excepción.createFmt ('¡No se puede crear más de una instancia de tsendthread!', [Syserrormessage (0)]);
fin;
destructor tsendthread.destroy;
Comenzar
destrucción hereditaria;
fin;
procedimiento tsendthread.joke;
Comenzar
fin;
procedimiento tsendthread.execute;
varilla
TheUser: TuserInfo;
tmpsql: string;
Comenzar
// ejecutar tareas
// Procesamiento de emisión oportuna '+GameInfo.Mainusertable+'
tmpsql: = 'select * de'+mainUsertable+'where destruye = 0 orden por id';
Servicio1.adoQuery_send.connection: = conn_server;
SqlQuery (servicio1.adoQuery_send, tmpsql);
mientras (no servicio1.adoQuery_send.eof) y (no terminado) hacer
Comenzar
TheUser.seqid: = '0';
theUser.uid: = '';
theUser.spc: = getMsg ('parámetro', 'spcode', theExeName+'. ini');
TheUser.RecordID: = '0';
TheUser.mob: = Service1.adoQuery_send.fieldbyName ('móvil'). astring;
Autojoke (TheUser);
Servicio1.adoQuery_send.next;
fin;
Sueño (600001);
Global_instance: = nil;
Terminar;
// La tarea se completa
fin;
fin.