#1 Low level and performance » Gif animé en thread » 2013-08-18 10:09:14

Zorglub
Replies: 1

J'utilise devexpress pour mes composants visuels, et j'essaye d'afficher un gif animé (pour une "wait form") pendant un traitement lourd.
Le pb est que devexpress s'execute dans le thread principal et qu'il peut faire des modifications visuelles (mettre à jour une grid par exemple).
Or si j'execute ma form avec le gif animé dans un autre thread, il y a un conflit d'affichage entre mon thread et devexpress ; devexpress n'utilisant pas Synchronize.
Y a t il un moyen de "resynchroniser" les messages windows d'affichage entre ces 2 traitements ?
je sais, ce n'est pas très clair.

#2 Re: Low level and performance » Ptr to call local function » 2010-12-17 16:43:18

c'était juste un exemple !

je l'utilise dans une HashTable quand je parcours toute la table:

procedure Essai;
  procedure Proc1(AItem:TItem);
  begin
     /////traitement pour chaque item
  end;
begin
  HashTable.TraverseLocal(@Proc1);
end;

c'est très pratique!

#3 Low level and performance » Ptr to call local function » 2010-12-17 16:10:14

Zorglub
Replies: 3

est ce que tu connais cette technique pour appeler une fonction locale par l'intermediaire d'un pointeur  ?


function MagicCaseOf(ABasePointer:Pointer; const AIndex:Integer; const AProcTab:array of TProcedure):Integer;overload;
begin
  if (AIndex >= Low(AProcTab)) and (AIndex <= High(AProcTab)) then
  begin
    Result := AIndex;
    asm push ABasePointer end;
    AProcTab[Result]();
    asm pop ABasePointer end;
  end
  else Result := -1;
end;

function MagicCaseOf(const AIndex:Integer; const AProcTab:array of TProcedure):Integer;
var
  BasePointer: Pointer;
begin
  asm push [ebp] end;       // BasePointer
  asm pop BasePointer end;

  Result := MagicCaseOf(BasePointer, AIndex, AProcTab);
end;


procedure TMainForm.Button1Click(Sender: TObject);
var
  Val0, Val1:Integer;
  value:Integer;
  procedure ExecProc0();
  begin
    ShowMessage('ExecProc0 ' + IntToStr(Val0));
  end;
  procedure ExecProc1();
  begin
    ShowMessage('ExecProc1 ' + IntToStr(Val1));
  end;
begin
  Val0 := 111;
  Val1 := 222;
  value := 1;
  if MagicCaseOf(value , [@ExecProc0,@ExecProc1]) = -1 then
    ShowMessage('else');
end;

Board footer

Powered by FluxBB