Programme ne repond pas ... [Résolu]

DavKli 30 Messages postés mardi 10 mars 2009Date d'inscription 31 octobre 2013 Dernière intervention - 4 avril 2010 à 19:19 - Dernière réponse : DavKli 30 Messages postés mardi 10 mars 2009Date d'inscription 31 octobre 2013 Dernière intervention
- 13 avril 2010 à 17:40
Delphi 7 Entreprise
Windows XP, SP3


Bonjour a tous.

Voila mon probleme. J'ai une petit application qui fait appel a divers services web (web service).

Le probleme a ce niveau est que la reqete web prend un certaine temps que l'utilisateur n'a pas de reponse et aini un travail fluid n'est pas possible, ce qui est fort desagreable.

Ce n'est pas non plus possible d'ajouter un simmple "Application.Processmessage" car la reqete ce simplement une seule ligne. J'ai pensé d'ecrire une app. a part seulement pour ce requete et un autre pour realiser le traitement du resultat.

Quelle sont vos propositions ?

Merci pour votre aide.
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 5 avril 2010 à 18:28
3
Merci
Salut,

voici une correction basique mais fonctionnelle du code :
[hr]unit Unit2;


[b]interface

uses
  /bClasses, Sysutils, TypInfo, Forms,
  ActiveX; // pour CoInitialize

[b]type
  /bTUnThread =   class (TThread)
  [b]private
    /bastr: string;  // ajouté
  [b]protected
    procedure /bWriteOutput; // ajoué
    procedure Execute; override;
    procedure Action;
  end;

[b]implementation

uses /bUnit1, CurrencyConvertor;

procedure TUnThread.Action;
[b]var
  /bws: CurrencyConvertorSoap;
  Str1: string;
  int1: Integer;
  Dou1: Double;
[b]begin
  /b//Form1.LabelThread.Caption : = IntToStr(Compteur);
  Ws :=  GetCurrencyConvertorSoap;
     for  Int1 : = 0 to ord(High(Currency))-1 [b]do
    /b // -1 sinon le dernier élément provoque une erreur
    [b]begin
      /b// permet de quitter la boucle si on demande la fin du thread
      if Terminated [b]then
        /bExit;
      Str1 : =  GetEnumName(TypeInfo(Currency), integer(Int1));
      [b]try
      /bDou1 := Ws.ConversionRate(USD, Currency(int1));
      [b]except
      /bDou1 := 0;
       end ;
      astr : = Str1 + ' - ' +FloatToStr(Dou1);
      // il ne faut pas tout synchroniser
      // que l'affichage
      Synchronize(WriteOutput);
    end;
end;

procedure TUnThread.Execute;
[b]begin
  /bCoInitialize(nil); // indispensable
  Action;
  CoUninitialize;
end;

procedure TUnThread.WriteOutput;
[b]begin
  /b//Affichage synchronisé
  Form1.Listbox1.Items.Add(astr);
end;

end.


[hr]@+Cirec
[hr]

Merci Cirec 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Cirec
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 5 avril 2010 à 02:30
0
Merci
Salut,
essaye d'utiliser un Thread séparé, dans lequel tu fais tes requêtes web. Si tu implémentes bien le thread il devrait tourner en parallèle avec ton appli sans la ralentir

Cordialement, Bacterius !
Commenter la réponse de Bacterius
DavKli 30 Messages postés mardi 10 mars 2009Date d'inscription 31 octobre 2013 Dernière intervention - 5 avril 2010 à 15:52
0
Merci
Voila, j'ai reusi a ajouter un Thread, mais le probleme reste le meme, je perd la main (Programm ne repond pas)...

Voici l'exemple utilisé ...

La form principale :
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Unit2, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ButtonStopThread: TButton;
    ListBox1: TListBox;
    procedure ButtonStopThreadClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;
  UnThread:TUnThread;
  
implementation

{$R *.DFM}

procedure TForm1.ButtonStopThreadClick(Sender: TObject);
begin
  if Assigned(UnThread) then UnThread.Terminate;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  UnThread:=TUnThread.Create(True); { True : création suspendue – il ne s'exécute pas encore }
  UnThread.FreeOnTerminate:=True;//on veut une destruction automatique après exécution.
  UnThread.Priority:= tpNormal;
  UnThread.Resume;
end;

end.


Unit2, ce seulement tous pour le Thread :
unit Unit2;

interface

uses
  Classes, Sysutils, TypInfo, Forms;

type
  TUnThread = class(TThread)
  private
  protected
    procedure Execute; override;
    procedure Action;
  end;

implementation

uses Unit1, CurrencyConvertor;

procedure TUnThread.Action;
var
  ws: CurrencyConvertorSoap;
  Str1: String;
  int1: Integer;
  Dou1: Double;
begin
  //Form1.LabelThread.Caption := IntToStr(Compteur);
  Ws := GetCurrencyConvertorSoap;
  for Int1 := 0 to ord(High(Currency)) do
  begin
    Str1 := GetEnumName(TypeInfo(Currency), integer(Int1));
    try
    Dou1 := Ws.ConversionRate(USD, Currency(int1));
    except
    Dou1 := 0;
    end;
    Form1.Listbox1.Items.Add(Str1 + ' - ' +FloatToStr(Dou1));
  end;
end;

procedure TUnThread.Execute;
begin
  Synchronize(Action);
end;

end.


Et suivant ce le code generé automatiquement quand j'import le webservice :

unit CurrencyConvertor;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

type
  Currency = (
      AFA, 
      ALL, 
      DZD, 
      ARS,
      AWG, 
      AUD, 
      BSD, 
      BHD, 
      BDT, 
      BBD, 
      BZD, 
      BMD, 
      BTN, 
      BOB,
      BWP, 
      BRL, 
      GBP, 
      BND, 
      BIF, 
      XOF, 
      XAF, 
      KHR, 
      CAD, 
      CVE,
      KYD, 
      CLP, 
      CNY, 
      COP, 
      KMF, 
      CRC, 
      HRK, 
      CUP, 
      CYP, 
      CZK,
      DKK, 
      DJF, 
      DOP, 
      XCD, 
      EGP, 
      SVC, 
      EEK, 
      ETB, 
      EUR, 
      FKP,
      GMD, 
      GHC, 
      GIP, 
      XAU, 
      GTQ, 
      GNF, 
      GYD, 
      HTG, 
      HNL, 
      HKD,
      HUF, 
      ISK, 
      INR, 
      IDR, 
      IQD, 
      ILS, 
      JMD, 
      JPY, 
      JOD, 
      KZT,
      KES, 
      KRW, 
      KWD, 
      LAK, 
      LVL, 
      LBP, 
      LSL, 
      LRD, 
      LYD, 
      LTL,
      MOP, 
      MKD, 
      MGF, 
      MWK, 
      MYR, 
      MVR, 
      MTL, 
      MRO, 
      MUR, 
      MXN,
      MDL, 
      MNT, 
      MAD, 
      MZM, 
      MMK, 
      NAD, 
      NPR, 
      ANG, 
      NZD, 
      NIO,
      NGN, 
      KPW, 
      NOK, 
      OMR, 
      XPF, 
      PKR, 
      XPD, 
      PAB, 
      PGK, 
      PYG,
      PEN, 
      PHP, 
      XPT, 
      PLN, 
      QAR, 
      ROL, 
      RUB, 
      WST, 
      STD,
      SAR, 
      SCR, 
      SLL, 
      XAG, 
      SGD, 
      SKK, 
      SIT, 
      SBD, 
      SOS,
      ZAR, 
      LKR, 
      SHP, 
      SDD, 
      SRG, 
      SZL, 
      SEK, 
      CHF,
      SYP, 
      TWD, 
      TZS, 
      THB, 
      TOP, 
      TTD, 
      TND, 
      TRL,
      USD, 
      AED, 
      UGX, 
      UAH, 
      UYU, 
      VUV, 
      VEB, 
      VND,
      YER, 
      YUM, 
      ZMK, 
      ZWD, 
      TRY_
      );

  // ************************************************************************ //
  // Namespace : http://www.webserviceX.NET/
  // soapAction: http://www.webserviceX.NET/ConversionRate
  // transport : http://schemas.xmlsoap.org/soap/http
  // style     : document
  // binding   : CurrencyConvertorSoap
  // service   : CurrencyConvertor
  // port      : CurrencyConvertorSoap
  // URL       : http://www.webservicex.net/CurrencyConvertor.asmx
  // ************************************************************************ //
  CurrencyConvertorSoap = interface(IInvokable)
  ['{A1817D10-F9A2-B6F6-30E2-8FFB22ABBD60}']
    function  ConversionRate(const FromCurrency: Currency; const ToCurrency: Currency): Double; stdcall;
  end;

function GetCurrencyConvertorSoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): CurrencyConvertorSoap;


implementation

function GetCurrencyConvertorSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): CurrencyConvertorSoap;
const
  defWSDL = 'http://www.webservicex.net/CurrencyConvertor.asmx?wsdl';
  defURL  = 'http://www.webservicex.net/CurrencyConvertor.asmx';
  defSvc  = 'CurrencyConvertor';
  defPrt  = 'CurrencyConvertorSoap';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as CurrencyConvertorSoap);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result nil) and (HTTPRIO nil) then
      RIO.Free;
  end;
end;


initialization
  InvRegistry.RegisterInterface(TypeInfo(CurrencyConvertorSoap), 'http://www.webserviceX.NET/', 'utf-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(CurrencyConvertorSoap), 'http://www.webserviceX.NET/ConversionRate');
  InvRegistry.RegisterInvokeOptions(TypeInfo(CurrencyConvertorSoap), ioDocument);
  RemClassRegistry.RegisterXSInfo(TypeInfo(Currency), 'http://www.webserviceX.NET/', 'Currency');
  RemClassRegistry.RegisterExternalPropName(TypeInfo(Currency), 'TRY_', 'TRY');

end.
Commenter la réponse de DavKli
cs_Forman 663 Messages postés samedi 8 juin 2002Date d'inscription 6 avril 2010 Dernière intervention - 6 avril 2010 à 04:35
0
Merci
J'arrive un peu tard

Je crois que la solution de Cirec devrait régler ton problème de blocage. Synchronize reporte l'exécution d'une méthode dans le thread principal (et occupe celui-ci jusqu'à la fin du traitement), donc tout l'intérêt du thread est perdu si tu fais tout le travail dans cette méthode. Grosso modo, il faut y mettre seulement ce qui concerne l'interface utilisateur.
Commenter la réponse de cs_Forman
DavKli 30 Messages postés mardi 10 mars 2009Date d'inscription 31 octobre 2013 Dernière intervention - 6 avril 2010 à 09:33
0
Merci
Merci a vous...

Je vais essayer quand j'ai un peu plus de temps... :-)
Commenter la réponse de DavKli
DavKli 30 Messages postés mardi 10 mars 2009Date d'inscription 31 octobre 2013 Dernière intervention - 11 avril 2010 à 12:40
0
Merci
Bon,

voila un peu plus de temps aujourd'hui. Et ca marche sans souci. Merci a vous
Commenter la réponse de DavKli
DavKli 30 Messages postés mardi 10 mars 2009Date d'inscription 31 octobre 2013 Dernière intervention - 13 avril 2010 à 17:40
0
Merci
Encore une probleme a regler : Chez moi ca marche sans souci, mais sur n'import quelle autre poste, impossible a faire fonctionner... Deja tous les demandes retournons une erreur "Dou := 0" et si je veut fermer, impossible avec l'erreur "invalid Windows handle"...

Vous avez une idee ce que ca peut etre ? Merci d'avance ...
Commenter la réponse de DavKli

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.