Async + STA Thread State [Résolu]

MiharbiDoNo 150 Messages postés dimanche 17 mai 2009Date d'inscription 25 mai 2012 Dernière intervention - 18 juil. 2010 à 02:48 - Dernière réponse : MiharbiDoNo 150 Messages postés dimanche 17 mai 2009Date d'inscription 25 mai 2012 Dernière intervention
- 19 juil. 2010 à 02:28
Bonjour,
pendant que j'utilise un tcpclient, avec les methodes async BeginRead, BeginWrite, je veux acceder au Clipboard, ce qui est impossible, car l'access au Clipboard demande que the thread wui va faire l'appel doit avoir STA Comme apartment Attitude. alors comment modifé l'attitude du thread qui va terminer l'operation async, au bien comme pouvoir acceder au Clipboard, sans cette attitude.
Merci.
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
MiharbiDoNo 150 Messages postés dimanche 17 mai 2009Date d'inscription 25 mai 2012 Dernière intervention - 18 juil. 2010 à 16:58
3
Merci
Bonjour,
j'ai trouver une petite solution temporaire, c'est d'utilisé les api OpenClipboard, GetClipboardData et CloseClipboard. dommage que je peux pas utilisé la class Clipboard Du .net, mais bon on cherche encore de bonne solution.
merci.

Merci MiharbiDoNo 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de MiharbiDoNo
Meilleure réponse
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 19 juil. 2010 à 00:02
3
Merci
Je viens de faire un essai avec d'autres delegate et c'est toujours le cas. Le thread de callback est toujours MTA. Je n'avais jamais fait attention ce point.

Dans ce cas je ne vois pas d'autre solution que de faire :
Private Sub EndReading(ByVal ar As IAsyncResult)
        Dim monParametreAStocker As Object
        Dim th As New Thread(AddressOf AccessClipBoard)
        th.SetApartmentState(ApartmentState.STA)
        th.Start(monParametreAStocker)
        th.Join()
End Sub

Private Sub AccessClipBoard(ByVal obj As Object)
        Clipboard.SetDataObject(obj)
End Sub

Merci foliv57 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de foliv57
Meilleure réponse
MiharbiDoNo 150 Messages postés dimanche 17 mai 2009Date d'inscription 25 mai 2012 Dernière intervention - 19 juil. 2010 à 02:28
3
Merci
oui ça semble d'etre la seule methode, pour avoir un thread STA. ou bien faut utiliser les API du Clipboard. merci pour votre repense.

Merci MiharbiDoNo 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de MiharbiDoNo
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 18 juil. 2010 à 10:36
0
Merci
Bonjour,

Pour modifier l'apartment state d'un thread, il y a deux possibilités :

Pour le thread principal, on peut utiliser un attribut
<MTAThread> _
Shared Sub Main()
End Sub

ou
<STAThread> _
Shared Sub Main()
End Sub


Pour un thread créé par code
Dim newThread As Thread = New Thread(AddressOf ThreadMethod)
newThread.SetApartmentState(ApartmentState.MTA)

ou
Dim newThread As Thread = New Thread(AddressOf ThreadMethod)
newThread.SetApartmentState(ApartmentState.STA)
Commenter la réponse de foliv57
MiharbiDoNo 150 Messages postés dimanche 17 mai 2009Date d'inscription 25 mai 2012 Dernière intervention - 18 juil. 2010 à 16:07
0
Merci
Bonjour,
merci pour la repense, mais j'arrive pas à resoudre le probleme.
j'utilise la methode Stream.BeginRead, qui va crée un autre thread pour ne pas blocké le thread en cours. après cette operation, elle va appeler la SUB ou en fait appel à la methode EndRead pour terminer l'oreration async. donc je controle pas le thread qui va etre crée, pour pouvoir "SetApartmentState". pour l'attribute <STAThread>, j'ai essayé de le metre avant le thread principal, et aussi avant la methode qui va terminer l'oreration async (ou on appelle EndRead), bref, mon thread est toujours MTA.


un exemple de mon code :
    Sub MySUB()
        'Commence l'operation async de lecture
        Stream.BeginRead(Buffer, offset, Size, New AsyncCallback(AddressOf EndReading), Nothing)
    End Sub
    Sub EndReading(ByVal ar As IAsyncResult)
        'on  termine l'operation...
        Stream.EndRead(ar)
        'la, notre thread doit etre STA, mais il est MTA...
    End Sub
Commenter la réponse de MiharbiDoNo
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 18 juil. 2010 à 21:01
0
Merci
Oui, malheuresement le delegate cré un thread ayant le même apartment state que le thread appelant.

Le seul moyen est de créer son propre thread pour modifier l'apartment state (donc de ne pas utiliser BeginRead). Ce qui est peut-etre meme plus judicieux si les réceptions sont nombreuse car en utilisant les delegate, a chaque réception un thread est créé puis détrui.

Ou alors de faire quelque chose de pas très correcte mais qui doit marcher :
Private Sub StartRead()
   Dim newThread As Thread = New Thread(AddressOf ThreadMethod)
   newThread.SetApartmentState(ApartmentState.STA)
   newThread.Start()
End Sub

Private Sub ThreadMethod()
    Stream.BeginRead(Buffer, offset, Size, New AsyncCallback(AddressOf EndReading), Nothing)
End Sub
Commenter la réponse de foliv57
MiharbiDoNo 150 Messages postés dimanche 17 mai 2009Date d'inscription 25 mai 2012 Dernière intervention - 18 juil. 2010 à 22:16
0
Merci
elle semble bonne ta methode, mais c'est une perte de ressources, puisque on va crée un autre thread de plus a chaque lecture... et on doit le libérer aussi...
j'vais essayé de crée le main thread STA, et toutes les création de threads STA Aussi, et j'vais voir si le thread resultant est STA aussi ou non. merci foliv pour ton aide.
Commenter la réponse de MiharbiDoNo
MiharbiDoNo 150 Messages postés dimanche 17 mai 2009Date d'inscription 25 mai 2012 Dernière intervention - 18 juil. 2010 à 23:01
0
Merci
non, le thread qui va s'executer après le callback est toujours MTA. bizzare comment Microsoft n'as pas pensé à ça.
Commenter la réponse de MiharbiDoNo
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 18 juil. 2010 à 23:22
0
Merci
Ce qui est étonant aussi c'est que, par défaut, le thread principal de l'application devrait être STA.

Faite un essai en faisant un petit :
MsgBox(Thread.CurrentThread.GetApartmentState().ToString)


à l'ouverture de votre formulaire principal.
Commenter la réponse de foliv57
MiharbiDoNo 150 Messages postés dimanche 17 mai 2009Date d'inscription 25 mai 2012 Dernière intervention - 18 juil. 2010 à 23:35
0
Merci
c'est exactement la methode avec laquelle j'aime verifié les propriété en temp reélle. c'est fait:
thread principal : STA
verification dans MySUB : STA (evident, même thread)
verification dans EndReading : MTA!!
j'ai meme ajouté l'attribute <STAThread> devant tout les SUB et function Qui vont etre appelés, et rien, le thread crée par l'operation async reste toujours MTA.
Commenter la réponse de MiharbiDoNo

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.