Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

85 commentaire(s) de Xya sur des sources sur tout CodeS-SourceS

Le : 29/04/2009 18:28:53
Source : AUTOSOCKET, UN CLONE DU CONTRÔLE WINSOCK EN .NET
C'est vrai que les classes de Socket de .NET sont pas pratiques à utiliser avec Windows Forms, parce qu'elle ont été pensées pour être utilisée dans une partie client ou serveur de l'application, et non pas mélangée à la présentation (Forms).

Donc d'un côté c'est moins pratique, mais ça force à bien réfléchir à l'architecture de l'application, le flux de données, les threads, etc. Perso c'est quelque chose que j'adore et que je trouve hyper intéressant, mais ça demande pas mal de temps et de recherches.

Par exemple c'est pas une bonne chose d'appeler des fonctions blocantes (synchrones) sur le thread de l'interface graphique, puisque ça fait freezer l'affichage de tes fenêtres. C'est pour ça que le plus simple c'est d'avoir un thread dédié à ton socket. L'alternative c'est d'utiliser les fonctions asynchrones ou des événements mais c'est plus difficile à bien structurer, enfin c'est mon point de vue.


Le : 29/04/2009 14:57:10
Source : AUTOSOCKET, UN CLONE DU CONTRÔLE WINSOCK EN .NET
Pas de soucis :)

Ce qui m'étonne un peu c'est que ce bout de code soit toujours utile et utilisé, même 5 ans après que je l'ai écrit !

A+

Xya


Le : 29/04/2009 14:27:59
Source : AUTOSOCKET, UN CLONE DU CONTRÔLE WINSOCK EN .NET
Tu peux utiliser n'importe quel contrôle comme SynchronizingObject.

Par exemple imaginons que tu crées le socket dans le constructeur de ta form:

Public Sub New()
   '...
   Me.socket = New AutoSocket()
   Me.socket.SynchronizingObject = Me
End Sub

et après dans tes gestionnaires d'événements t'as plus à te soucier de Invoke/BeginInvoke (cad les événements sont automatiquement exécut´s dans le thread principal):

Private sub Control_Disconnect (sender as Object, e as System.EventArgs) Handles Control.Disconnect
    'Je veu par exemple afficher "déconnecté" dans un label
     label.Text = "Déconnecté"
End sub



Le : 29/04/2009 12:44:02
Source : AUTOSOCKET, UN CLONE DU CONTRÔLE WINSOCK EN .NET
L'idé c'est de rajouter une propriété à la classe:

Protected syncObj As ISynchronizeInvoke           'objet de synchronisation Windows Forms

    Public Property SynchronizingObject() As ISynchronizeInvoke
        Get
            Return syncObj
        End Get
        Set(ByVal Value As ISynchronizeInvoke)
            syncObj = Value
        End Set
    End Property

Pour chaque événment tu dois ajouter une méthode OnXXX qui détermine si on doit utiliser BeginInvoke ou pas:

    Public Event Disconnected(ByVal sender As Object, ByVal e As EventArgs)

    Protected Overridable Sub OnDisconnected(ByVal e As EventArgs)
        If Not syncObj Is Nothing AndAlso syncObj.InvokeRequired Then
            Dim deleg As New EventHandler(AddressOf SyncDisconnected)
            syncObj.BeginInvoke(deleg, New Object() {Me, e})
        Else
            SyncDisconnected(sender, e)
        End If
    End Sub

Et une øéthode SyncXXX qui déclenche juste l'événement:

    Protected Sub SyncDisconnected(ByVal sender As Object, ByVal e As EventArgs)
        RaiseEvent Disconnected(sender, e)
    End Sub

La version VB.NET est un peu lourde, comme je pense pas qu'on puisse récupérer le délégué de l'événement contrairement à C#, sinon on pourrait faire (dans OnXXX):

syncObj.BeginInvoke(Me._delegue_Disconnected, New Object() {Me, e})

et se passer de SyncXXX.

Pas de soucis :p J'espère que ca te øettra sur la voie.


Le : 29/04/2009 08:29:19
Source : AUTOSOCKET, UN CLONE DU CONTRÔLE WINSOCK EN .NET
Pt'être que pour des raisons de performances cette règle n'est vérifiée que quand tu lance ton programme dans un débogueur comme Visual Studio? De toute qu'elle soit vérifiée ou pas vaut mieux la suivre, ssurtout pour une appli réseau. Je me souviens avoir eu des bugs vraiment bizarre/aléatoires quand je le faisais pas


Le : 29/04/2009 00:24:36
Source : AUTOSOCKET, UN CLONE DU CONTRÔLE WINSOCK EN .NET
Si je me souviens bien (j'ai écrit ce code y'a 5 ans quand même :p et pas le courage de le télécharger et de le regarder), le socket doit utiliser un thread d'arrière plan pour gérer les différents événements.

Le problème, c'est que tout les contrôle windows forms (namespace System.Windows.Forms.*) doivent être impérativement utilisés sur le thread principal (c'est à dire tout code qui accède à leur méthodes et propriétés). Il n'y avait aucune vérification dans le Framework 1.1, par contre je crois que c'est à partir du 2.0 que cette "règle est vérifiée", et si elle n'est pas respectée, tu obtiens l'exception que tu as copié-collé.

La solution la plus rapide, c'est d'appeller BeginInvoke/Invoke dans tous les événements du socket, de sorte à exécuter le code qui accède à Windows Forms dans le thread principal. Exemple:

Private Sub socket_DataArrival( sender As Object, data As Byte() )
    Me.BeginInvoke(ma_fonction_windows_forms, New Object[] {data}) ' synatxe VB?
End Sub

Private Sub ma_fonction_windows_forms(data As Byte())
    txtClientInput.Text = Encoding.UTF8.GetString(data)
End Sub

Ca fait des années que j'ai pas fait de VB.NET (et pas de compilateur sous la main), donc je me souviens plus de la syntaxe, surtout pour la création de tableau et le passage du délégué (voir commentaire).
L'idée c'est tu passe un délégué de ta fonction (ici ma_fonction_windows_forms) comme 1er paramètre, et un tableau contenant la liste des paramètres de ta fonction comme 2ième paramètre. Ca c'est la solution rapide, bête et méchante, et pas hyper propre.

La solution plus "clean" serait de rajouter une propriété SynchronizingObject (de type ISrynchronizeInvoke -- interface implémentée par tous les contrôles Windows Forms) à la classe de Socket. Ensuite tu dois utiliser la méthode BeginInvoke de ton objet SynchronizingObject pour déclencher les événements.

Je pense qu'avec ça tu dois avoir pas mal de pistes pour régler le problème (je pense que tu devrais trouver sur le net le code pour utiliser BeginInvoke/Invoke et les événements VB.NET). J'espère que ça t'aidera!

Greetings from Norway
Xya


Le : 28/12/2007 17:00:48
Source : NMAKE VB.NET: COMPILATEUR DE PROJETS VB.NET SANS VISUAL STUDIO
Salut,

On peut compiler avec NMake des projets VB 2003 (et 2002 également si je me souviens bien) sans que Visual Studio soit installé. Par contre, il faut que le framework .Net 1.1+ soit installé.
Les projets VB 2005 peuvent être compilés sans VS par MSBuild qui est inclus dans le framework .Net 2.0+.

A+


Le : 10/12/2007 20:18:46
Source : RÉCUPÉRER LA FRÉQUENCE DU PROCESSEUR
Content de l'entendre :)

Sinon désolé pour les mises à jour multiples, et j'ai également oublié de retirer un fichier qui n'a rien à voir (FileDecrypt.cs).


Le : 10/12/2007 19:51:45
Source : RÉCUPÉRER LA FRÉQUENCE DU PROCESSEUR
Enfait je viens de me rendre compte que j'avais mis à jour mon code sans envoyer la version mise à jour sur ce site, ce que je vais faire de suite.


Le : 10/12/2007 19:46:15
Source : RÉCUPÉRER LA FRÉQUENCE DU PROCESSEUR
Salut,

Quelle version et édition de Windows utilises tu? (XP/Vista, 32/64 bit)
Si c'est Vista ou XP 64, l'erreur doit venir du fait que la mémoire allouée par AllocHGlobal ne possède pas le droit d'exécution.

Pour corriger cela, il fait ajouter un appel à VirtualProtect avant l'appel à CreateThread:

//ajoute le droit d'exécution à la page de mémoire allouée
int oldProtect;

VirtualProtect( hCode, new IntPtr( code.Length ), PAGE_EXECUTE_READWRITE, out oldProtect );

//crée un thread qui va exécuter la fonction ASM
hThread = CreateThread( IntPtr.Zero,
...

//constante et déclaration de VirtualProtect
private const int PAGE_EXECUTE_READWRITE = 0x40;

[DllImport("Kernel32.dll")]
private static extern void VirtualProtect( IntPtr adress, IntPtr size, int newProtect, out int oldProtect );



1 2 3 4 5 6 7 8 9


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,094 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.