[D10.3 CE] [FMX] Requête php dans thread qui fonctionne sous android mais pas win32
bonjour
terminé les présentations avec Rio, le boulot commence :mrgreen:
je possède une application windows qui inscrit des instructions dans une table d'une bdd mysql
j'aimerais faire une application FMX afin de permettre aux utilisateurs d'android d'interagir avec les utilisateurs windows
tout se fait avec des requêtes (get ou post), le principe :
1/ à l'ouverture de l'application, je fais une requête php pour récupèrer dans une variable le dernier id (clé primaire) de la table qui contient les instructions
2/ à partir de cette variable, je fais toutes les 1 seconde une requête pour lister les nouvelles entrées : je les traite bien sur et je met à jour ma variable (en gardant le dernier ID)
je passe bien entendu par un Thread (merci Paul TOTH) afin que l'application ne freez
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
TMonThread = class(TThread)
private
Target: TStrings;
List : TStrings;
procedure Done;
public
constructor Create(ATarget: TStrings);
destructor Destroy; override;
procedure Execute; override;
end;
constructor TMonThread.Create(ATarget: TStrings);
begin
Target := ATarget;
List := TStringList.Create;
inherited Create(False);
FreeOnTerminate := True;
end;
destructor TMonThread.Destroy;
begin
List.Free;
inherited;
end;
procedure TMonThread.Execute;
var
i, Index, alive, position_saut_de_ligne : Integer;
boucle_infinie : boolean;
recuperation_source, ligne_en_en_cours : string;
dernier_id : string;
begin
dernier_id := '567169'; // pour mes testes je le saisie manuellement, mais je ferai la récupération auto par la suite
boucle_infinie := true;
alive := 0;
while boucle_infinie = true do
begin
sleep(1000);
inc(alive);
form1.Label1.Text := 'Thread lancé depuis : ' + inttostr(alive); // afin de m'assurer que le thread tourne toujours
recuperation_source := UTF8ToString(GetURLAsString('http://mon.site/script.php?id=' + dernier_id));
recuperation_source := AnsiReplaceText(recuperation_source,'',''); // caractère bizarre que je supprime
// je travaille la source de la page afin de mettre dans ma liste les entrées de la BDD sans les retours chariots
if length(recuperation_source) > 0 then
begin
position_saut_de_ligne := Pos('<br>', recuperation_source);
List.clear;
// toutes les entrées récupérées dans la bdd seront dans ma list
while position_saut_de_ligne > 0 do
begin
ligne_en_en_cours := Gauche('<br>', recuperation_source);
recuperation_source := Droite('<br>', recuperation_source);
position_saut_de_ligne := Pos('<br>', recuperation_source);
List.Add(ligne_en_en_cours);
end;
// je parcours ma liste pour ajouter les instructions à mon Memo ET JE RECUPERE LE DERNIER ID
for i := 0 to List.Count-1 do
begin
ligne_en_en_cours := List[i];
dernier_id := Gauche('|', ligne_en_en_cours);
instruction := Droite('|', ligne_en_en_cours);
form1.memo1.Lines.Add(instruction);
end;
form1.Memo1.GoToTextEnd;
Synchronize(Done);
end;
end;
end;
procedure TMonThread.Done;
begin
Target.Assign(List);
end;
function GetURLAsString(const aURL: string): string;
var
lHTTP: TIdHTTP;
begin
lHTTP := TIdHTTP.Create(nil);
try
Result := lHTTP.Get(aURL);
finally
lHTTP.Free;
end;
end;
function droite(substr: string; s: string): string;
begin
if pos(substr,s)=0 then result:='' else
result:=copy(s, pos(substr, s)+length(substr), length(s)-pos(substr, s)+length(substr));
end;
function gauche(substr: string; s: string): string;
begin
result:=copy(s, 1, pos(substr, s)-1);
end; |
Problème :
1/ l'application a été réalisé avec delphi 7 et fonctionne bien : dans mon Tmemo j'ai bien les instructions de la table et ma variable contient bien le dernier ID de la table ce qui me permettra d'interroger pour avoir les nouvelles entrées
2/ sous FMX en win32 la première boucle fonctionne après le thread s'arrête : après multiple tests, le problème provient de l'ID de la table que je récupère (pourtant c'est bien du texte, j'ai vérifié c'est conforme)
j'ai remplacé dernier_id par un Tedit, je mettais à jour manuellement l'id de recherche, et ça fonctionnait (mais bon je veux un truc automatisé biensur)
3/ sous android ça fonctionne !!! le thread ne meurt pas, il continue, du coup je reçois les nouvelles entrées sans problème
4/ est ce que ma méthode est la bonne ? le thread ? j'ai entendu parlé des Itask, et du anonymous thread, mais celui ci m'a l'air performant non ? concernant les requêtes, j'ai fait du classique, mais j'ai aussi lu qu'il y avait de nouvelle méthode avec rio ? qu'en pensez vous
je sais que j'ai été un peu long, je m'en excuse, mais c pour bien détaillé le problème