IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Exécution d'un process en asynchrone [Débutant]


Sujet :

ASP.NET

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Par défaut Exécution d'un process en asynchrone
    Bonjour à tous,

    Je viens de récupérer une page Web codée en C#. Cette page permet, grâce à un bouton, de lancer un .bat côté serveur qui lance lui même SQLLoader pour charger un fichier .CSV dans une table temporaire, puis lance une procédure stockée pour effectuer des traitements métier et les injecter dans 1 ou plusieurs tables cibles.
    L'exécution se fait graâce à la commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ProcessStartInfo startInfo = new ProcessStartInfo(Environment.GetEnvironmentVariable("DIR")+"\\load\\load.cmd");
    myProcess = Process.Start(startInfo);
    Cela marche plutôt pas mal, mise à part le fait que lorsque le volume de données à injecter est important, et donc le traitement est long, alors l'exécution tombe en Timeout. (La procédure stokée poursuit bien côté Oracle, mais .net et/ou iss lève un timeout).

    J'ai donc pensé à passer le traitement en asynchrone, et mettre sur l'IHM un petit message du genre "traitement en cours" avec un petit icone qui tourne.

    J'ai donc modifier mon code afin de mettre l'éxécution dans un thread comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    try{
    			Process myProcess = null;			
    			ProcessStartInfo startInfo = new ProcessStartInfo(Environment.GetEnvironmentVariable("DIR")+"\\load\\load.cmd");			
    			startInfo.Arguments = loginUser.Value;
     
    			ThreadPool.QueueUserWorkItem(delegate {
     
    				myProcess = Process.Start(startInfo);
     
    				if(myProcess.WaitForExit(99999999)) {
    					msgRetour.Value = "La procédure d'import est terminé. Veuillez vérifier les logs.";
    					messagetxt.Attributes["class"] = "message";
    				} else {
    					msgRetour.Value = "TIMEOUT";
    					messagetxt.Attributes["class"] = "message";
    				}
     
    			});
     
    			while (!myProcess.HasExited)
    			{
    				Thread.Sleep(1000);
    				msgRetour.Value = "Veuillez patienter pendant les traitements d'import.";
    				messagetxt.Attributes["class"] = "message";
    			}
     
    			msgRetour.Value = "AFTER THREAD";
    			messagetxt.Attributes["class"] = "message";
     
    			// Je renitialise les fichiers importes
    			fichImp.InnerHtml = "";
     
    		}
    		catch (Exception p) {
    		throw (p);
    		}
    Mon problème est que ma variable myProcess (dans mon while) n'a pas l'air d'être reconnue dans ce contexte. J'ai le message d'erreur suivant sur lancement du traitement: La référence d'objet n'est pas définie à une instance d'un objet.
    Je ne sais pas si la méthode est la bonne pour répondre à mon besoin. Sachant que je ne peux pas modifier toute l'architecture, et que je suis pas habitué à ce language.

    Auriez-vous une idée concernant mon problème? Merci beaucoup d'avance.

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    En ASP.NET l'approche est un peu différente, les contraintes n'étant pas les mêmes. Tu peux regarder du côté des Pages Asynchrones, et des PageAsyncTask.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Salut,
    Citation Envoyé par critok Voir le message
    donc le traitement est long, alors l'exécution tombe en Timeout
    Tu entends quoi par long? Combien de temps? Tu peux augmenter le temps d'attente grâce au fichier de configuration. Mais cela ne te protégera pas d'une interruption de réseau ou une fermeture intempestive du navigateur.

    Puisque tu utilises un thread tu peux le laisser partir sans attendre de retour. Une fois le traitement terminé tu mets à jour un paramètre dans ta base ou tu laisses un fichier spécifique pour dire que le traitement est OK.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    Salut,Tu entends quoi par long? Combien de temps? Tu peux augmenter le temps d'attente grâce au fichier de configuration. Mais cela ne te protégera pas d'une interruption de réseau ou une fermeture intempestive du navigateur.

    Puisque tu utilises un thread tu peux le laisser partir sans attendre de retour. Une fois le traitement terminé tu mets à jour un paramètre dans ta base ou tu laisses un fichier spécifique pour dire que le traitement est OK.

    A+
    Bonjour,

    Merci pour vos réponses.

    Certains traitements durent plus de 5min (parfois 10mn selon la volumétrie du fichier .csv en entrée). Et comme le Timeout est positionné sur 120s...
    J'ai bien pensé à augmenter le timeout .net et IIS mais cela ne me semble pas correct.

    Au dela de ce problème de Timeout, il y a également le fait que l'utilisateur ne soit pas informé du statut du traitement.
    Actuellement, l'utilisateur clique sur le bouton, le traitement se lance, et la page rend la main uniquement lorsque le traitement est terminé. Comme la page / IE se bloquent et que le traitement et parfois long, certains utilisateur pensent que tous est planté.

    C'est pour cela que je souhaiterais partir sur une méthode qui permette de lancer le traitement en tache de fond, et montrer à l'utilisateur que le traitement est en cours, via une gif qui tourne par exemple sur ma fenêtre principale, ou bien via une popup temporaire avec un "Loading" et une image animée qui disparaîtraient en fin de traitement.

    J'ai également pensé mettre à jour un paramètre en base mais je voulais éviter de faire des allez retour en base toute les x secondes et pensais pouvoir traiter directement dans la page.

    Dans mon exemple le traitement se lance bien en tâche de fond mais lorsque je fais mon while, il n'a pas l'air de voir ma variable myProcess initiallisée (alors qu'elle l'est pourtant dans le thread).

    Si j'avais la possibilité de récupérer cette variable, je pourrais boucler en conséquence pour voir le statut du traitement.

    Je vais regarder du côté des PageAsyncTask comme conseillé par DotNetMatt mais sans connaissance C# c'est un peu hard

    Merci à vous.

  5. #5
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Citation Envoyé par critok Voir le message
    du côté des PageAsyncTask
    En reprenant l'exemple sur la MSDN, on constate que la page ne restitue aucune information dans le navigateur avant d'avoir complètement fini. Ton problème restera le même.

    Avant de penser au C# pense déjà à ce que tu veux dans le langage que tu connais.
    "Winter is coming" (ma nouvelle page d'accueil)

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    En reprenant l'exemple sur la MSDN, on constate que la page ne restitue aucune information dans le navigateur avant d'avoir complètement fini. Ton problème restera le même.

    Avant de penser au C# pense déjà à ce que tu veux dans le langage que tu connais.
    Effectivement, j'ai transposé l'exemple MSDN dans mon application, et on ne peut pas restituer d'information tant que le traitement n'est pas terminé

    En fait, j'ai hérité de cette application en l'état, basé sur un progiciel codée en javascript et asp pour les appels BD et C# (pour l'exécution du .bat), et je ne peux pas modifier complétement la fonctionnalité, et les écrans car les utilisateurs sont habitués.

    Dans le pire des cas, je peux sur clique du bouton:

    0/ Je vérifie qu'un traitement n'est pas en cours sur le user qui clique sur le bouton. Si Ok on poursuit, Si Ko on ne lance pas le traitement et j'affiche un message.
    1/ via C# j'apelle un bout de code javascript qui log une entrée dans une table "traitement" Exemple: Traitement id=1634163, User= TOTO, Type=ImportPersonnes, Statut=Encours
    2/ Je lance mon .cmd via C# en mode asynchrone via un thread (comme dans mon exemple)
    Le CMD va lancer SQLLoader, puis la procédure stockée. A la fin de la PS, je rajoute un update pour passer le traitement à Finish.
    3/ De suite et toujours via C# je lance une popup modale (avec un loading) qui va scruter (en javascript / asp) toute les 5 secondes si le traitement est terminé (statut=finish pour le type de traitement et le user donné).
    Si traitement terminé, on ferme la popup et j'affiche le résultat, si pas terminé, je continue à boucler.

    Qu'en pensez vous?

  7. #7
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Citation Envoyé par critok Voir le message
    Qu'en pensez vous?
    Ca me parait un bon début.
    "Winter is coming" (ma nouvelle page d'accueil)

  8. #8
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Arf oui en effet je pensais que ça aurait pu répondre au problème exposé, mais il faut mettre en place une mécanique avec du Javascript pour pouvoir avoir le rendu à l'écran pendant l'exécution des tâches asynchrones, car avec les PageAsyncTasks le postback ne se termine pas tant que toutes les tâches ne sont pas terminées...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    Arf oui en effet je pensais que ça aurait pu répondre au problème exposé, mais il faut mettre en place une mécanique avec du Javascript pour pouvoir avoir le rendu à l'écran pendant l'exécution des tâches asynchrones, car avec les PageAsyncTasks le postback ne se termine pas tant que toutes les tâches ne sont pas terminées...
    Exactement.

    Bon la je bloque sur mon point 0/ à savoir: via C# j'apelle un bout de code javascript qui ...

    J'ai une méthode javascript disons logTable(user) {...} dans un bloc <SCRIPT language=javascript>

    Puis j'ai mon code C# dans une méthode protected void CallBatch(object sender, EventArgs e) qui est elle même dans un bloc <script language="C#" runat="server">

    Puis-je appeler ma méthode javascript logTable depuis le code C# CallBatch ?

    Merci

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Par défaut
    Citation Envoyé par critok Voir le message
    Exactement.

    Bon la je bloque sur mon point 0/ à savoir: via C# j'apelle un bout de code javascript qui ...

    J'ai une méthode javascript disons logTable(user) {...} dans un bloc <SCRIPT language=javascript>

    Puis j'ai mon code C# dans une méthode protected void CallBatch(object sender, EventArgs e) qui est elle même dans un bloc <script language="C#" runat="server">

    Puis-je appeler ma méthode javascript logTable depuis le code C# CallBatch ?

    Merci
    J'ai trouvé pour le javascript donc je post içi comme j'ai pas mal géléré:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClientScript.RegisterStartupScript(this.GetType(), "nom", "login('"+ loginUser.Value +"')", true);
    Je poursuis l'implémentation de ma solution. Merci

  11. #11
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Citation Envoyé par critok Voir le message
    Puis-je appeler ma méthode javascript logTable depuis le code C# CallBatch ?
    Dans un premier temps considérons que non. Disons simplement que le code C# s'exécute sur le serveur IIS qui se trouve peut-être aux Etats-Unis. Le code JavaScript dans le navigateur du client. IIS reçoit une demande de page. Celle-ci est restituée au demandeur mais IIS ne conserve pas de connexion avec ce dernier. Afin de recevoir les données mises à jour le client doit redemander la page au serveur IIS.

    Est-ce que tu as allé faire un tour sur la FAQ? Cela te permettrait de comprendre certains principes de base. Si tu n'as pas trop avancé, tu devrait développer tes pages en séparant le code "inline" du code serveur: http://msdn.microsoft.com/fr-fr/library/015103yb.aspx.

    Cette fonction ClientScript.RegisterStartupScript te permet d'ajouter du code JavaScript dans ta page, c'est tout. Par contre, ce code JavaScript doit te permettre de faire des demandes de page au serveur. Sais-tu comment faire?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Par défaut
    Bon voila que je rencontre un autre pb maintenant

    J'ai mon code c# suivant: CallBatch est appelé sur clique d'un bouton.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <script language="C#" runat="server">
     
    protected void CallBatch(object sender, EventArgs e)
    	{
    		try{
     
    			execEnCours.Value = "";
    			ClientScript.RegisterStartupScript(this.GetType(), "nom1", "verificationExec();", true);
     
    			ClientScript.RegisterStartupScript(this.GetType(), "nom5", "alerteExecEnCours('valeur "+execEnCours.Value+"');", true);
     
    			if (execEnCours.Value == "false") {
     
    				// Je lance mon .cmd	
    			             ClientScript.RegisterStartupScript(this.GetType(), "nom2", "alerteExecEnCours('dedans false');", true);
     
    			} else {
     
    				ClientScript.RegisterStartupScript(this.GetType(), "nom3", "alerteExecEnCours('dedans true');", true);
    				ClientScript.RegisterStartupScript(this.GetType(), "nom4", "alerteExecEnCours('Execution en cours');", true);
     
    			}
     
    		}
    		catch (Exception p) {
    		throw (p);
    		}
    	}
    avec mon code javascript permettant de vérifier si une exécution est en cours:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <SCRIPT language=javascript>
     
    function verificationExec()
    {
    	alert('chaine');
    	var NbRows = parseInt(Ma requête qui renvoie 0 ou 1)
     
    	if (NbRows == 0)
    	{
    		document.getElementById('execEnCours').value = "false";
    		alert(document.getElementById('execEnCours').value);
     
    	} else {
     
    		document.getElementById('execEnCours').value = "true";
    		alert(document.getElementById('execEnCours').value);
     
    	}
     
    }
     
    function alerteExecEnCours(message)
    {
    	alert(message);
     
    }
    Comme on ne peut pas récupérer de retour de la function javascript via ClientScript.RegisterStartupScript (enfin c'est ce que j'ai cru comprendre sur le net),
    J'ai créé une variable cachée dans mon formulaire (execEnCours) que je remplie dans ma fonction verificationExec.
    Le alert(document.getElementById('execEnCours').value); affiche bien true ou false. Donc pas de pb jusque là.

    Par contre après avoir appelé verificationExec depuis mon code C#, je n'arrive pas à récupérer ma valeur via execEnCours.Value. Elle est vide.
    J'ai vu cela car le ClientScript.RegisterStartupScript(this.GetType(), "nom5", "alerteExecEnCours('valeur "+execEnCours.Value+"');", true); du code c# affiche seulement "valeur "

    Je ne comprends pas. Auriez-vous une idée? J'espère que ce n'est pas parsque la valeur est côté client, et que le code c# côté serveur ne connaissait pas la valeur au moment ou il a été lancé.

    Merci

  13. #13
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    J'ai l'impression d'écrire dans le vide...

    J'hésite........ Ne sachant pas trop quel est ton niveau en développement, il faut à mon avis procéder en plusieurs étapes. Est-ce que tu veux bien suivre les étapes que je vais t'indiquer?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  14. #14
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Par défaut
    re,

    Non non tu ne parles pas dans le vide. J'ai bien lu ce que tu as écris.

    C'est juste que je travaille sous un progiciel très particulier qui ne me permet pas de faire tous ce que je voudrais.

    Mon niveau est plutôt avancé en dev (dev java) mais aucunes connaissances en .net et C#

    Je suis à l'écoute de tes propositions, mais j'ai peur qu'au final que cela ne soit pas réalisables à cause du fameux progiciel.

  15. #15
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Citation Envoyé par critok Voir le message
    Mon niveau est plutôt avancé en dev (dev java) mais aucunes connaissances en .net et C#
    Ok, tu devrais pas être trop perturbé par la syntaxe du langage. C'est cool. Tu fait du web ou du client lourd?

    Quelle version du Framework .Net est-ce que tu utilises? Peux-tu créer des web service?

    Le scénario est le suivant, fais le dans l'ordre:
    1. Mets en place le système de suivit de l'avancement de ton processus. L'idée de la table en base est bonne. Mettons que tu as un million d'enregistrements à traiter, tous les 1000 tu mets à jour un compteur en base.
    2. Tu crées un service web avec une méthode "StartProcess" et "QueryProcess":
      1. Reprend le code de l'action de ton bouton dans la méthode "StartProcess";
      2. Implémente le code nécessaire dans la méthode "QueryProcess" pour récupérer la valeur du compteur.

    3. Tu crées un page web HTML (pas besoin de aspx) dans laquelle tu références simplement la librairie jQuery avec:
      1. Un bouton qui va déclencher un appel Ajax sur la méthode "StartProcess";
      2. Le clic sur ce bouton déclenche un appel Ajax sur la méthode "QueryProcess" dont la réponse sera la valeur du compteur que tu vas afficher dans la page HTML.


    Qu'en penses-tu?

    J'attend tes retours sur le premier point.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  16. #16
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 113
    Par défaut
    rebonjour,

    Désolé pour la réponse tardive. Pour ceux que ca intéresse, j'ai régler mon problème assez simplement:

    J'ai tout d'abord transformé mon code initial (qui lancé le .cmd via code C# serveur) afin de lancer le .cmd dans un thread.
    Cela a pour effet de ne pas bloquer sur le code, puis de recharger la page.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    hreadPool.QueueUserWorkItem(delegate {
                Process process = Process.Start(startInfo);
                if(process.WaitForExit(timeout)) {
                    // user exited
                } else {
                    // timeout
                }
            });
    Dans mon .cmd, j'ai ajouté une commande sqlplus qui insère une ligne dans une table EXEC_BATCH avec un flag à 1. La procédure stockée (qui prend pas mal de temps) est lancée par la suite.

    Au rechargement de ma page, j'ai ajouté un bout de code javascript vérifiant dans la table EXEC_BATCH si un traitement est en cours (flag=1).

    Si c'est le cas, alors je met un petit voile noir transparent sur la page avec une petite animation (truc qui tourne). J'ai ajouté un timer javascript qui fait la vérification toute les 2s.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setInterval(function(){verification()},2000);
    Au bout de x minutes, lorsque la procédure stockée est terminée, celle-ci passe le flag à 0 grace à un update.

    Dans le timer, lorsque la vérification retourne le flag à 0, cela à pour effet de sortir du timer, et poursuivre sur une fonction qui fait disparaitre le voile noir transparent, et l'image d'attente. J'affiche également un message à l'utilisateur.

    Voila. Cette solution est finalement pas mal, car si l'utilisateur ferme la fenêtre après avoir lancé le traitement, et revient sur la fenêtre, l'icone d'attente apparait.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/03/2012, 11h01
  2. Réponses: 1
    Dernier message: 28/10/2011, 11h43
  3. Exécution d'un process orphelin
    Par jgalbois dans le forum Apache
    Réponses: 3
    Dernier message: 19/08/2010, 16h56
  4. exécution d'un process en c# 2.0
    Par tatikambwa dans le forum C#
    Réponses: 4
    Dernier message: 24/10/2008, 18h56
  5. Lancer exécutable en asynchrone
    Par ZeKiD dans le forum ANT
    Réponses: 4
    Dernier message: 30/03/2004, 16h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo