J'ai fait un exemple vite fait pour illustrer un de mes problemes dans un logiciel que je suis en train de faire.
Quand on fait un http get, le main form freeze tant qu'on n'a pas la réponse. Voici un exemple qui fait figer le form :
J'ai mis un loop de 5 pour que ça représente mieux mon problème car dans mon logiciel j'ai plusieurs valeurs à aller chercher sur le serveur, donc plusieurs get les uns après les autres.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3uses IdHTTP, Threading;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3var HTTP: TIdHTTP;
J'ai essayé de wrapper mes get avec des TTask.Run. C'est ok, mais, vu que ça fait plusieurs get les uns après les autres, il n'a pas fini le premier get avant de faire le 2ème get... Ça part en couille d'erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 for tempind := 0 to 5 do begin try Memo1.Text := Memo1.Text + HTTP.Get('https://fapi.binance.com/fapi/v1/exchangeInfo') + #13#10; except on E: Exception do ShowMessage(E.Message) end; end;
Une solution est de mettre le loop à l'intérieur du task, mais je ne peux pas faire ça, car les get viennent de plusieurs places différentes dans le programme.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 for tempind := 0 to 5 do begin TTask.Run( procedure begin try Memo1.Text := Memo1.Text + HTTP.Get('https://fapi.binance.com/fapi/v1/exchangeInfo') + #13#10; except on E: Exception do ShowMessage(E.Message) end; end); end;
J'ai pensé à un système de queue à l'entrée de ma fonction gethttp, qui lui fait appel au http.get au fur et à mesure qu'il en a fini un.
Par contre, le queuewait doit looper avec un while et un Application.ProcessMessages, sinon mon main freeze. Jusqu'ici avec un queue, un loop Application.ProcessMessages, un système de ttaks.run pour exécuter le get sans que ça freeze le main, c'est ok.
J'ai eu des choses intéressantes qui sont ok avec le queue, mais, si je close ma fenêtre, ça appelle le destroy de mon queue, des fois il y a encore des get qui sont en ligne dans le queue. Je suis rendu au fait que je dois attendre que le queue soit tout fini avant de finir le destroy. Donc un while queue.count > 0 vous allez dire ou while not queue.empty lolll ben ça freeze mon main form encore. Si je ne veux pas que ça freeze mon main form, je dois ajouter un Application.ProcessMessages dans mon while ... Ça part en couille d'erreur, on ne peut pas faire Application.ProcessMessages, dans le destroy à cause du fait que l'application est en train de se fermer.
Partager