У меня есть следующая проблема/вопрос.Как выполнить синхронизацию потока с отдельного блока
У меня есть подразделение с именем myGlobalFunctions.pas. Внутри этого устройства я реализовал несколько процедур/функций, которые используются несколькими проектами.
Проект 1 Использование данного устройства
проект 3 Использование данного устройства
проект 6 Использование данного устройства т.д.
внутри «Проект 1» есть поток, который используют функции внутри «глобальной функции " Ед. изм.
внутри проекта 3 нет нити, но функции используются.
до сих пор эта нить (project1) обеспечивает практически не обновление интерфейса приложения и обновление было сделано до или после вызова функции из «myGlobalFunctions.pas»
как «перед запуском function1» ... вызов «после функции1».
таким образом я могу знать, что делает программа.
Однако теперь я хочу реализовать внутри «функции1» обновление интерфейса приложения (с синхронизацией).
Я хочу отразить в интерфейсе приложения «этап обработки1 ... xx records». (для набора данных есть цикл while).
Использование Synchronize для «project1» и с нормальным ярлыком1.caption = 'message'; application.process для любого другого проекта.
Возможно ли это?
как я могу это сделать.
может быть Thread Safe?
ТКС много
Разван здесь некоторый код, чтобы лучше понять
THREAD UNIT
procedure TThreadSyncronizeProcess.SignalStart;
begin
frmMain.sbMain.Panels[2].Text := 'Syncronizare in desfasurare...'; -- exist all the time
if Assigned(frmSyncronize) then begin -- check if exist this
frmSyncronize.logMain.WriteFeedBackMessage('Pornire syncronizare...', '', EVENTLOG_INFORMATION_TYPE, True);
end;
end;
procedure TThreadSyncronizeProcess.Execute;
var ..... declarations
begin
Synchronize(SignalStart); -- this is normal call within thread update interface
try
try
workSession := TIB_Session.Create(nil);
workDatabase := TIB_Database.Create(workSession);
... creating more components and setup them ...
uSyncronizareFunctions.SetupDatabase(workDatabase, workSession, transactionWrite, transactionRead);
uSyncronizareFunctions.SetupDataSnapConnection(workConnectionRead, providerRead);
if Assigned(frmSyncronize) then begin
uSyncronizareFunctions.SetupFeedBack(frmSyncronize.logMain);
end;
try
Synchronize(SignalMessage);
// this next function is from the "global unit"
isAllOk := uSyncronizareFunctions.ImportOperatoriAutorizati(workImage, workLabelProgress, True);
isAllOk := isAllOk and uSyncronizareFunctions.ImportJudete;
isAllOk := isAllOk and uSyncronizareFunctions.ImportLocalitati;
isAllOk := isAllOk and uSyncronizareFunctions.ImportUM;
isAllOk := isAllOk and uSyncronizareFunctions.ImportFurnizori;
isAllOk := isAllOk and uSyncronizareFunctions.ImportClasificari;
except
on e : Exception do begin
raise Exception.Create(dmMain.GetDataSnapExceptionMessage(e.Message));
end;
end;
except
on e : Exception do begin
baseMessage := e.Message;
Synchronize(SignalMessage);
end;
end;
finally
workDatabase.ForceDisconnect;
FreeAndNil(transactionRead);
... etc
end;
Synchronize(SignalFinish);
end;
global function unit
unit uSyncronizareFunctions;
function ImportOperatoriAutorizati(imgDone : TImage; labelProgress : TLabel; isThread : Boolean) : Boolean;
var workQuery : TIB_Query;
serverData : TClientDataSet;
begin
Result := True;
try
... create all that we need
serverData.Close;
serverData.CommandText := 'SELECT * FROM OPERATORI_AUTORIZATI WHERE REC_VERSION > :ARECVERSION ORDER BY REC_VERSION, ID';
serverData.Params.Clear;
serverData.Params.CreateParam(ftInteger, 'ARECVERSION', ptInput);
serverData.Params.ParamByName('ARECVERSION').AsInteger := lastVersion;
serverData.Active := True;
...... I want here to signal start
while not serverData.Eof do begin
try
globalInsert_Tran.StartTransaction;
workQuery.Close;
workQuery.ParamByName('AIDGLOBAL').AsString := serverData.FieldByName('IDGLOBAL').AsString;
workQuery.Open;
if workQuery.IsEmpty then begin
workQuery.Insert;
workQuery.FieldByName('IDGLOBAL').AsString := serverData.FieldByName('IDGLOBAL').AsString;
end else begin
workQuery.Edit;
end;
workQuery.FieldByName('NUME').AsString := serverData.FieldByName('NUME').AsString;
workQuery.FieldByName('COD_AUTORIZARE').AsString := serverData.FieldByName('COD_AUTORIZARE').AsString;
workQuery.FieldByName('OTHER_INFO').AsString := serverData.FieldByName('OTHER_INFO').AsString;
workQuery.FieldByName('DATASTERGERE').AsVariant := GetValueDate(serverData.FieldByName('DATASTERGERE').AsDateTime);
workQuery.FieldByName('REC_VERSION').AsInteger := serverData.FieldByName('REC_VERSION').AsInteger;
workQuery.Post;
MarkRecordAsDirtyFalse(workQuery);
globalInsert_Tran.Commit;
...... I want here to signal progress and to see in the application interface "processing record xx/100" or any other message
except
on e : Exception do begin
Result := False;
globalInsert_Tran.Rollback;
end;
end;
serverData.Next;
end;
finally
FreeAndNil(serverData);
FreeAndNil(workQuery);
end;
end;
Пожалуйста, [править], чтобы включить ** соответствующие ** части вашего кода, чтобы мы могли попробовать и помочь вам. Ваше описание очень расплывчато, и код поможет сделать его более понятным. (Пожалуйста, напишите * достаточно кода *, чтобы сделать ваш вопрос ясным, пожалуйста, не просто сбрасывайте тонны кода здесь и ожидайте, что мы попытаемся понять его.) Спасибо. –
Если я понимаю вас правильно, у вас есть поток, который должен вести себя по-разному в зависимости от того, какое приложение оно используется. Разница в том, что синхронизация с основным потоком должна выполнять другой код. –
nope. Я хочу, чтобы регулярная функция вела себя по-разному для потока и для обычного другого устройства. –