Timer, chronomètre. Csharp

Bonjour…
Je suis le créateur d’un petit chatterbot Jeanneton (un robot parleur,
dire une Ia serait prétentiard. C’est fait avec le moteur Verbots qui
est écrit en CSharp…) Si on veut lui parler, c’est ici:
www.jeanneton.blueinfos.com…

Je voudrai le perfectionner… Je ne suis pas du tout programmeur…
(Je me casse ! Bon d’accord…)

Plus sérieusement, j’aimerai que qqun m’aide à faire un chronomètre…

C’est à dire. Jeanneton, mon bot. Ex il possède en output un texte à lire…

“Aurevoir ami.”
( est la commande qui ferme le programme.)

C’est là mon problème. Cette commande agit immédiatement avant que
mon bot ait finit sa phrase… Je voudrai délayer ça.

Ex: Jeanneton dit:
“Aurevoir ami.” Puis, le code en c sharp que je vous demande compte
5 secondes (ou 10, qqchose de réglable), et ferme l’application…
Laissant au bot le temps de terminer sa phrase.

Donc si qqun à le temps, la gentillesse. Bon je sais que les non(s)
pros sont des pénibles. (J’ai mal au dos à force de faire des
courbettes. :0) Soyez cool et ne m’envoyez pas ballader.)

Amicalement
Sylvain

Bonjour à toi

Pour mettre un timer en C#, je vois deux moyens :

  1. tu met ton thread en pause, c’est à dire que tu met ton programme en pause un certain temps (que tu auras définis) de cette manière

using System.Thread;  // tu mets ça au début de ton programme, avec les autres using

//TODO

Thread.Sleep(X); // où X est un temps en milliseconde

Le soucis avec le Thread.Sleep, c’est que TOUT ton programme va faire se mettre sur pause (boutons inactifs, …)

  1. avec l’objet Timer, que je ne connais pas, malheureusement, mais une petite recherche sur msdn t’expliquera comment t’en servir

Merci… Ok je vois, rien n’est fastoche…
Avant tout, un exemple de “code module” CSharp qui n’a rien à voir avec
ce que je vous demande, c’est juste pour situer la chose et vous montrer
comment ça fonctionne. Il sert à manipuler le moteur Verbots. Ce code
interdit les " .:,;!? " dans une variable.

__
Code module
Fonction:
Function Name:
asterix
Parameter:
string op1
Return Type
string

Code:
string target = @".:,;!?";
char[] anyOf = target.ToCharArray();
if (op1.IndexOfAny(anyOf, 0) >= 0) op1 = op1.Substring(0, op1.IndexOfAny(anyOf, 0));
return op1;
__

Ex de conversation:
Rule Name: Test [thing] ?
Input Text: Test [thing] ?
Output Text: [thing].

Si je tape “Test grenouille ?” , le bot répond
“Grenouile ?”

Ok facile, si je rajoute cette fonction plus ht le code module du moteur
et si je retape “Test grenouille ?” , le bot répond
“Grenouille”

Plus de “?”
Super. C’était le but.

(On appelle la fonction en output comme ça:
Input Text: Test [thing] ?
Output Text: “<?csharp Console.WriteLine(Athena.asterix(vars["thing"])); ?>”. “[thing]”.)

J’ai trouve un bout de code avec 4 fonctions qui semble détecter
le début etla fin du texte lu par mon bot. C’est dans un
“code module” (ajouté au moteur Verbot.) Nouvelle conversation:
Rule Name: Hello
Input Text: Hello
Output Text: Bye.

Voilà le code module qui permet de faire ça (réprérer le début et la
fin d’un phrare…)

__
Code module.
*Fonction 1:

Function name:
OnBeforeRuleFired
Parameter:
State s
Return Type:
Console.WriteLine(“A OnBeforeRuleFired triggered”);

code:
Console.WriteLine(“A OnBeforeRuleFired triggered”);
/*
Console.WriteLine(“State Object: “);
foreach(object oKey in s.Vars.Keys)
{
Console.WriteLine(oKey + " : " + (string)s.Vars[oKey]);
}
*/
//Console.WriteLine(“Changing Input to “test””);
//s.Vars[”_input”] = “test”;
__

__
*Fonction 2 :

Function name:
OnAfterRuleFired

Parameter:
State s, Reply r

Return Type:
void

Code
Console.WriteLine(“B OnAfterRuleFired triggered.”);
/*
Console.WriteLine("State Object: ");
foreach(object oKey in s.Vars.Keys)
{
Console.WriteLine(oKey + " : " + (string)s.Vars[oKey]);
}

Console.WriteLine("Reply Object: ");
Console.WriteLine("r.Text: " + r.Text);
Console.WriteLine("r.AgentText: " + r.AgentText);
Console.WriteLine("r.Cmd: " + r.Cmd);
Console.WriteLine("r.RuleId: " + r.RuleId);
*/
__

__
*Fonction 3:

Function name:
OnNoRuleFired

Parameter
State s, Reply r

Return Type
void

Code
Console.WriteLine(“C OnNoRuleFired triggered”);

__
*Fonction 4:

Function name:
OnNoOutputFound

Parameter
Hashtable vars, Reply r

Return Type
string

Code:
Console.WriteLine(“OnNoOutputFound”);
Console.WriteLine(“Reply Object Details:”);
Console.WriteLine("Chosen Rule ID: " + r.RuleId);
Console.WriteLine("From KB: " + r.KBItem.Filename);

return “OnNoOutputFound”;
__

Conversation.
Rule Name: Hello
Input Text: Hello
Output Text: Bye.

Ex, si je tape en input “Hello”, j’obtiens en output:

A OnBeforeRuleFired triggered
Salut.
B OnAfterRuleFired triggered.

Si je ne me “fourvoie” pas, je peux donc détecter cette fin de phrase
où je pourrai placer ce fameux “timer” (J’ai regardé ici
msdn.microsoft.com…
et essayé plein de truc. Mais à part faire planter l’application
Verbots, nada…

Donc normalement, sachant repérer un début et une fin de phrase
lue, il devrait être possible de placer le timer que je vous demande
et tant désiré à cette endroit, et de l’appeler en output d’une façon
ou d’une autre, non ?

Amicalement.
Sylvain.
Ps: Si je deviens ourd, oubliez ce post.

si le timer fait planter l’appli, tu peux essayer ceci


datetime ta_variable = Datetime.Now();

while (ta_variable < ta_variable + X) // X en milliseconde il me semble
{}


J’utilise ce petit bout de code pour faire patienter mes applis.

Désolé mais tu parles à un âne en programmation…
Où je place ce code ?
A quel endroit dans mes code modules ?

Pfff… Sorry…
Sylvain

Après que ton bot ai affiché le dernier message

Désolé mais il faut que tu sois plus précis je suis une buse en programmation…
Dis-moi exactement où comment… Pff… Sorry.

Sinon j’ai essayer ça dans une output:

<?csharp Console.Write("lets wait for 5 seconds"); DateTime dt1 = DateTime.Now; int diff = 0; while (diff < 5) { DateTime dt2 = DateTime.Now; TimeSpan ts = dt2.Subtract(dt1); diff = (int)ts.TotalSeconds; } Console.Write("time has passed."); ?>

Et ça plante parfois. (Win7) ou contrairement à l’effet désiré le moteur verbot
pause 5 sec avant de dire quoi que ce soit… Un peu comme
System.Threading.Thread.Sleep(5000)

Sylvain.

Bon je continue toujours de chercher à droite à gauche…
Attention le dernier code que j’ai posté juste au dessus semble bien pourri…
Ce que je voudrai est en fait très simple, enfin ça parait très simple
pour un quidam comme moi. Un code qui se déclanche à un moment, dure
un temps choisit pas une variable et qui le temps dévolue, fait autre chose,
ou rien. Où mettre ce code, j’en sais rien en fait je parle de chose que je
ne comprends pas.
Si vous avez le temps…
Merci.
Sylvain