Режим Singleton используется для ограничения только одного объекта определенного класса в процессе. ), если прибытия генерируют поток, но если до выполнения этого потока достигнут другие часы, он может генерировать несколько потоков для выполнения задачи, что приведет к путанице, поэтому рассмотрите возможность использования режима Singleton для решения этой проблемы (конечно, есть и другие Решения.
Основной код заключается в следующем:
// таймер
Процедура tservice1.timer_maintimer (отправитель: tobject);
вар
MyStringList: TStringList;
SearchRec: tsearchRec;
Сейчас время: String;
Начинать
пытаться
DateTimetoString (сейчас время, «HH: NN», сейчас);
Если leftstr (сейчас время, 4) = leftstr (getMsg ('game', 'time evingance', theExename+'. ini'), 4) тогда
Начинать
// Создать отправку потока
Global_instance: = tsendthread.getInstance;
/////////////////////////////////
конец;
кроме
на E: Исключение Do
Начинать
MyStringList: = tStringList.Create;
Если FileExists (ExtractFilePath (paramstr (0))+'err.txt') тогда
MyStringList.LoadFromFile (ExtractFilePath (paramstr (0))+'err.txt');
MyStringList.Add ('('+DateTimeToStr (теперь)+') [Ошибка создание потока:]'+e.message);
MyStringList.SavetOfile (ExtractFilePath (paramstr (0))+'err.txt');
MyStringList.free;
Если FindFirst (ExtractFilePath (paramstr (0))+'err.txt', faanyfile, searchRec) = 0 тогда
Начинать
Если SearchRec.Size> 5000000, тогда
Начинать
Renamefile (ExtractFilePath (paramstr (0))+'err.txt', ansireplacestr (extractfilepath (paramstr (0))+'err.txt', '. Txt', formatdatetime ('yyyy-mm-dd hh-mm-ss ', сейчас)+'. TXT '));
конец;
конец;
конец;
конец;
конец;
// резьбое блок
UNIT UNIT_SEND;
интерфейс
Использование
Sysutils, классы, напор, Main;
тип
Tsendthread = class (tthread)
публичный
конструктор Create (CreateSusped: Boolean);
разрушитель разрушает;
Функция класса GetInstance: TsendThread;
Процедура шутка;
защищен
процедура выполнить;
конец;
вар
Global_instance: Tsendthread;
Выполнение
использует DB;
Функция класса tsendthread.getinstance: tsendthread;
Начинать
Если Global_instance = Nil Then
Начинать
Global_instance: = tsendthread.create (false);
конец;
Результат: = Global_Instance;
конец;
конструктор tsendthread.create (CreateSusped: Boolean);
Начинать
Если Global_instance = Nil Then
Начинать
унаследованное создание (CreateSusped);
FreeOnTerminate: = true;
конец
еще
поднять exection.createfmt («Не может создать более одного экземпляра TsendThread!», [syserrormessage (0)]);
конец;
деструктор tsendthread.destroy;
Начинать
унаследованное уничтожение;
конец;
Процедура tsendthread.joke;
Начинать
конец;
Процедура tsendthread.execute;
вар
Theuser: Tuserinfo;
tmpsql: string;
Начинать
// выполнять задачи
// Обработка своевременной выдачи '+gameinfo.mainusertable+'
tmpsql: = 'select * from'+mainusertable+', где Dissult = 0 порядок по id';
Service1.adoquery_send.connection: = conn_server;
Sqlquery (service1.adoquery_send, tmpsql);
в то время как (не Service1.adoquery_send.eof) и (не прекращается)
Начинать
theuser.seqid: = '0';
theuser.uid: = '';
theuser.spc: = getMsg ('parameter', 'spcode', theExeName+'. ini');
theuser.recordid: = '0';
theuser.mob: = service1.adoquery_send.fieldbyname ('mobile'). Appring;
Autojoke (Theuser);
Service1.adoquery_send.next;
конец;
Сон (600001);
Global_instance: = nil;
Прекратить;
// задача завершена
конец;
конец.