Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

thread ...

3 réponses
Avatar
mosto
Bonjour j'ai une application Windows classique,

Dans un menu "Lancer processus" mon client doit cliquer pour lancer un
série d'actions qui peuvent prendre plusieurs seconde.
La première de ces actions consistent à instancier une classe, et de
lancer une fonction membre qui peut prendre plusieurs secondes. La
condition de fin d'execution de la fonction est un membre qui prend pour
valeur true;

...

ClassTest maClass= new ClassTest();
maClass.fonction();

je suis sur que la fonction est terminée lorsque le membre state est
égale à true.

Comment utiliser un thread qui me permette donc d'instancier ma classe
et d'attendre jusqu'a ce que la fonction est terminée son calcul, c'est
à dire quand le membre .state est à true.


merci d'avance de me mettre sur la voie parceque je n'ai jamais utilisé
les thread, et tout ce que je trouve sur google est un peu trop complexe.

3 réponses

Avatar
Whiplash
Salut,

Es-tu bien sur que ton champ booléen est thread safe ?
Si tu comptes accéder à ce champ à partir d'un autre thread, il faut que ta classe mette en place un mécanisme d'accès concurrentiel
à ce booléen (thread safe par volatile ou lock ou autre...)

puis un thread qui boucle sur ce champ, du genre :

delegate void DelegateInvoke();

private DelegateInvoke fInvokeStopAction;

//dans constructeur
fInvokeStopAction = new DelegateInvoke(StopAction);
Thread fThread = new Thread(new ThreadStart(Run));

protected override void StopAction()
{
// ce que tu veux...
...
}

private void Run()
{
while (!maClass.State)
{
Thread.Sleep(fPause);
}
fControl.BeginInvoke(fInvokeStopAction);
}


@+

"mosto" a écrit dans le message de news: 46ac89a9$0$5088$
Bonjour j'ai une application Windows classique,

Dans un menu "Lancer processus" mon client doit cliquer pour lancer un série d'actions qui peuvent prendre plusieurs seconde.
La première de ces actions consistent à instancier une classe, et de lancer une fonction membre qui peut prendre plusieurs
secondes. La condition de fin d'execution de la fonction est un membre qui prend pour valeur true;

...

ClassTest maClass= new ClassTest();
maClass.fonction();

je suis sur que la fonction est terminée lorsque le membre state est égale à true.

Comment utiliser un thread qui me permette donc d'instancier ma classe et d'attendre jusqu'a ce que la fonction est terminée son
calcul, c'est à dire quand le membre .state est à true.


merci d'avance de me mettre sur la voie parceque je n'ai jamais utilisé les thread, et tout ce que je trouve sur google est un peu
trop complexe.


Avatar
Gilles TOURREAU
Le Sun, 29 Jul 2007 14:35:51 +0200, mosto a écrit:

Bonjour j'ai une application Windows classique,

Dans un menu "Lancer processus" mon client doit cliquer pour lancer un
série d'actions qui peuvent prendre plusieurs seconde.
La première de ces actions consistent à instancier une classe, et de
lancer une fonction membre qui peut prendre plusieurs secondes. La
condition de fin d'execution de la fonction est un membre qui prend pour
valeur true;

...

ClassTest maClass= new ClassTest();
maClass.fonction();

je suis sur que la fonction est terminée lorsque le membre state est
égale à true.

Comment utiliser un thread qui me permette donc d'instancier ma classe
et d'attendre jusqu'a ce que la fonction est terminée son calcul, c'est
à dire quand le membre .state est à true.


merci d'avance de me mettre sur la voie parceque je n'ai jamais utilisé
les thread, et tout ce que je trouve sur google est un peu trop complexe.



Etes-vous sur d'avoir besoin d'utiliser ce booléen ?

Car il existe plusieurs façons d'attendre la fin d'un thread sous .NET,
sans faire de l'attente active...
La première, la plus simple est de faire Thread.Join() sur votre Thread
que vous voulez attendre.
L'autre solution est d'utiliser un Mutex :
- Votre Thread principal attend que ce mutex soit libérer.
- Votre 2ème Thread execute la fonction et une fois terminé libère le
Thread.

Cordialement

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
ginoo
Moi j'ai un probleme au niveau de mon application qui doit récuperer une
page web dans un thread.


private void iPToolStripMenuItem_Click(object sender, EventArgs e)
{
Thread newThread = new Thread(ThreadMethod);
newThread.SetApartmentState(ApartmentState.STA);
newThread.Name = "Processus";
newThread.Start();
}

private void ThreadMethod()
{
PageWeb maPageWeb = new PageWeb();
while (!maPageWeb.getState())
{
//MessageBox.Show(maPageWeb.getState().ToString());
Thread.Sleep(500);
}
MessageBox.Show(monIP.getIP());
}

public class pageWeb
{
private string sPage;
private bool state;
WebBrowser wbPage = new WebBrowser();

public pageWeb()
{
state = false;
wbPage.DocumentCompleted += new
WebBrowserDocumentCompletedEventHandler(wbDocumentCompleted);
wbPage.Navigate("http://www.monsite.com/page.php");
}

void wbPage_DocumentCompleted(object sender,
wbDocumentCompletedEventArgs e)
{
sPage = wbPage.DocumentText;
if (sPage.Length > 0)
state = true;
}

public bool getState()
{
return state;
}

public string getPage()
{
return sPage;
}
}
}

Mon problème est que mon application boucle sans jamais m'afficher le
contenu de la page. Sauf quand je décommente la ligne
MessageBox.Show(maPageWeb.getState().ToString());
Là je récupère bien le contenu de la page