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

invoke/threading

7 réponses
Avatar
Sylo
Salut,

J'utilise le multi threading
J'ai besoin de faire des actions sur un dataset déclaré dans mon thread
principal alors que la manipulation se fait via un thread.
Je veux donc utiliser invoke pour faire toutes les manipulations du dataset

Ma question est la suivante:
Est ce que le fait de faire un invoke fait que la thread qui effectue
l'invoke prend la main sur le thread principale pour effectuer la
manipulation de l'invoke?
Par ex, je veux créer une datarow avec des valeurs dans mon dataset, je fait
un invoke sur le thread principal pour faire cette action. Est ce que
l'invoke, au moment de l'exécution, va ralentir (ou même prendre toute la
ressource) du thread principal ?

Merci pour votre aide
Sylo

7 réponses

Avatar
Jérémy Jeanson
Bonjour Sylo,

...tu es de retour sur les thread à ce que je vois ;)

Si j'ai bien compris et ce serrait idiot que je me trompe depuisle temsp
que j'utilise ce principe : la méthode invoke, fais un appel d'une
méthode dans le context du thread qui a servit à instancier l'objet.

En traduisant en français mot à mot on invoque le thread de
l'instanciation... genre invocation de l'esprit défunt du thread (mais
non il n'est pas mort :), c'est de la magie noire)... bon je sais que je
délir un peu, mais l'invocation ressemble à ça, on invoque ce qui n'est
plus là, ou on se glisse dans sa peau si tu veux.

--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Sylo
Salut Jeremy,

Effectivement de retour sur les threads et content de voir que tu invoke
toujours notre dieu commun framework .net :)
Depuis la dernière fois, j'ai un peu avancé, grâce entre autre à ton aide
qui me fut précisieuse. Mais au final, j'ai utiliser une autres façon de
faire plus efficace...
Hélas, le problème me revient dans la figure ce jour pour un autre truc et
là, pour le coup, je n'y couperais pas, cela sera du threading.

Pour être sur d'avoir bien compris ce que tu m'as dit, je vais t'expliquer
le truc avec un exemple concret de ma problèmatique.
Je suis sur une appli genre outllook avec une grille bindé sur une
datatable. Quand je clicke sur recevoir, j'ai un traitement qui me remonte
les mails du serveur. il tourne dans le thread principale et donc
l'utilisateur doit attendre que cela se finisse pour pouvoir travailler. Le
traitement rajoute des datarow dans le datatable bindé.

Si je fait un thread, il faut que je fasse un invoke pour créer le datarow,
le remplir et le rajouter au datatable.

Je voudrais savoir si ce invoke a une incidence sur le temps d'exécution de
la thread principale (par exemple, au moment de l'invoke, le thread appelle
le thread principale, attend que celui-ci ne fasse rien pour prendre la
main, faire son truc et redonne la main). Si cela se passe comme dans mon
exemple, cela voudra dire que l'utilisateur ne pourra rien faire au moment
de l'exécution du invoke (et on perd un peu l'intérêt du thread).

Est ce que c'est ca ???

J'espère avoir été clair, merci pour ton aide
Sylo


"Jérémy Jeanson" a écrit dans le message de news:

Bonjour Sylo,

...tu es de retour sur les thread à ce que je vois ;)

Si j'ai bien compris et ce serrait idiot que je me trompe depuisle temsp
que j'utilise ce principe : la méthode invoke, fais un appel d'une méthode
dans le context du thread qui a servit à instancier l'objet.

En traduisant en français mot à mot on invoque le thread de
l'instanciation... genre invocation de l'esprit défunt du thread (mais non
il n'est pas mort :), c'est de la magie noire)... bon je sais que je délir
un peu, mais l'invocation ressemble à ça, on invoque ce qui n'est plus là,
ou on se glisse dans sa peau si tu veux.

--
Jérémy JEANSON
MCP
http://www.jjeanson.fr


Avatar
Sylo
Pour être encore plus précis,
A la limite, je lance mon thread et celui-ci se contente de faire un invoke
ou tout le traitement de mon thread s'y trouve.
Est ce que dans ce cas là, cela fonctionne ou est ce que cela empêchera mon
utilisateur de travailler ?
Sylo

"Sylo" <sylvain.malleval[at]dotsoft.fr> a écrit dans le message de news:

Salut Jeremy,

Effectivement de retour sur les threads et content de voir que tu invoke
toujours notre dieu commun framework .net :)
Depuis la dernière fois, j'ai un peu avancé, grâce entre autre à ton aide
qui me fut précisieuse. Mais au final, j'ai utiliser une autres façon de
faire plus efficace...
Hélas, le problème me revient dans la figure ce jour pour un autre truc et
là, pour le coup, je n'y couperais pas, cela sera du threading.

Pour être sur d'avoir bien compris ce que tu m'as dit, je vais t'expliquer
le truc avec un exemple concret de ma problèmatique.
Je suis sur une appli genre outllook avec une grille bindé sur une
datatable. Quand je clicke sur recevoir, j'ai un traitement qui me remonte
les mails du serveur. il tourne dans le thread principale et donc
l'utilisateur doit attendre que cela se finisse pour pouvoir travailler.
Le traitement rajoute des datarow dans le datatable bindé.

Si je fait un thread, il faut que je fasse un invoke pour créer le
datarow, le remplir et le rajouter au datatable.

Je voudrais savoir si ce invoke a une incidence sur le temps d'exécution
de la thread principale (par exemple, au moment de l'invoke, le thread
appelle le thread principale, attend que celui-ci ne fasse rien pour
prendre la main, faire son truc et redonne la main). Si cela se passe
comme dans mon exemple, cela voudra dire que l'utilisateur ne pourra rien
faire au moment de l'exécution du invoke (et on perd un peu l'intérêt du
thread).

Est ce que c'est ca ???

J'espère avoir été clair, merci pour ton aide
Sylo


"Jérémy Jeanson" a écrit dans le message de news:

Bonjour Sylo,

...tu es de retour sur les thread à ce que je vois ;)

Si j'ai bien compris et ce serrait idiot que je me trompe depuisle temsp
que j'utilise ce principe : la méthode invoke, fais un appel d'une
méthode dans le context du thread qui a servit à instancier l'objet.

En traduisant en français mot à mot on invoque le thread de
l'instanciation... genre invocation de l'esprit défunt du thread (mais
non il n'est pas mort :), c'est de la magie noire)... bon je sais que je
délir un peu, mais l'invocation ressemble à ça, on invoque ce qui n'est
plus là, ou on se glisse dans sa peau si tu veux.

--
Jérémy JEANSON
MCP
http://www.jjeanson.fr






Avatar
Jérémy Jeanson
Cela semble effectivement être ça, enfin c'est tel que j'ai compris la
documentation.

Le petit truc sympathique c'est que le job demandé va invoqué le thread
dont il a besoin et quand ton utilisateur demande un traitemetn il
s'exécutera dans un nouveau thread ou un thread disponible, donc
l'utilisateur peut travailler :)

Mais quand on recherche des information sur le net on trouver des
documents qui font planer un léger doute, non pas sur la durée
d'exécution, mais sur le délais qui peut exister entre le moment où l'on
demande l'exécution et le lancement réelle de celle-ci... enfin cela
fait parti des règle du jeux à mon sens car en utilisant invoke on
demande à ce que l'action s'exécute dans un context particulier dès que
celui-ci est disponible. Donc rien de grave, surtout qu'il n'existe
aucune preuve que l'on allonge le temps d'exécution de l'action ou le
délais avant début de celle-ci.
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Jérémy Jeanson
ça doit fonctionner ainsi et c'est d'ailleurs tout l'interet de l'invoke
: on lance une méthode dans un nouveau thread et cette méthode demande
l'invoke si besoin.
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Sylo
Je viens de faire un test.
Je lance un thread dans mon thread principal
Le thread fait immédiatement un invoke sur le thread principale
Dans l'invoke, il y a une boucle infini qui incremente un compteur dans un
label sur la winform

Plusieurs chose:
Si je me contente de la boucle, le invoke prend "la main" sur le thread
principale et lache rien (même pas de mise à jour de la fenêtre pour
afficher la mise à jour du label. Du coup, je ne peux plus rien faire dans
mon thread principale
Avec un update de la fenêtre, on voit le compteur avancé mais je n'ai
toujours pas la main
Avec un doevents, je reprend la main entre chaque traitement. Si je garde la
main (en restant cliqué sur la barre de titre, par exemple), le invoke
semble attendre.

Donc ok, c pas top mais je m'en contenterais. Il faut juste que je veille à
pas garder la main trop longtemps dans le invoke

Merci pour ton aide
Sylo


"Jérémy Jeanson" a écrit dans le message de news:

Cela semble effectivement être ça, enfin c'est tel que j'ai compris la
documentation.

Le petit truc sympathique c'est que le job demandé va invoqué le thread
dont il a besoin et quand ton utilisateur demande un traitemetn il
s'exécutera dans un nouveau thread ou un thread disponible, donc
l'utilisateur peut travailler :)

Mais quand on recherche des information sur le net on trouver des
documents qui font planer un léger doute, non pas sur la durée
d'exécution, mais sur le délais qui peut exister entre le moment où l'on
demande l'exécution et le lancement réelle de celle-ci... enfin cela fait
parti des règle du jeux à mon sens car en utilisant invoke on demande à ce
que l'action s'exécute dans un context particulier dès que celui-ci est
disponible. Donc rien de grave, surtout qu'il n'existe aucune preuve que
l'on allonge le temps d'exécution de l'action ou le délais avant début de
celle-ci.
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr


Avatar
Jérémy Jeanson
Ton blocage est normal, pour faire une mise à jour d'un affichage en
multi-thread, les méthode invoke et invokerequiered sont un peu vieille
école car il existe depuis .net 2.0 le backgroundWorker qui est bien
plus trivial pour effectuer des mises à jours d'un formulaire et
effectuer une tache de fond en mode asynchrone.

le invoke est bien pratique du moment que l'on ne cherche pas à utiliser
la méthode invoke du formulaire que l'utilisateur veut manipuler, mais
celle d'un autre objet ou formulaire.
--
Jérémy JEANSON
MCP
http://www.jjeanson.fr