IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Multi thread pouvez vous me guider ?


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    chomeur
    Inscrit en
    Février 2014
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Février 2014
    Messages : 27
    Points : 25
    Points
    25
    Par défaut Multi thread pouvez vous me guider ?
    Bonjour,
    en suivant le cours de phillipe, j ai pas mal evoluer (par rapport a vb6)
    mais voila des chose qui se compliquent

    j utilise un moteur 3D, en ocx, je maitrise assez bien ses interactions en VB
    par contre voila
    je dois creer

    dans les communications les chose suivantes :
    une entete de com :
    1. Chat
    2. 3d
    3. quete
    4. message pnj
    5. interaction pnj


    ensuite en fonction de l entete de com
    j aurai :
    le texte a afficher
    la position a updater dans mysql
    à allez voire si la personne a deja la quete et si ce n est pas le cas, lui envoyer
    à faire parler les pnj utiles au jeu
    faire interagir le pnj en envoyant a tous les données qui le concerne (elles se trouve dans mysql)

    donc en gros, si j ai tout compris on utilise une structure
    du style :
    dim cli as Object
    et que je desire interroger un peux pret comme ceci

    IF (mareception.cli="chat") then
    bla vla, on affiche dans la fenete texte mareception.message
    exit if
    IF (mareception.cli="3d" then
    update de la base mareception.position
    et
    mareception.rotation
    exit if

    ect ......

    vous voyez ou je veux en venir ?

    peut on tout faire dans la meme form ?
    ou faut il utiliser une classe ou un module ?
    si tel est le cas, pouvez vous me faire ou m expliquer avec un exemple simple ?
    peut on tous mettre sur la meme classe/module ?
    ou en faut il 1 pour les acces reseau et 1 pour les acces mysql ? et dans ce cas comment les croiser ?

    Merci à tous

    Nom : question.png
Affichages : 390
Taille : 18,0 Ko

  2. #2
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Bonjour.

    Tout cela est manifestement très confus pour toi. Remettons les choses à plat.

    * "Form" signifie "formulaire". En l'occurrence une fenêtre. C'est une question d'interface utilisateur. A priori tu ne veux pas obliger l'utilisateur a naviguer entre plusieurs fenêtres, donc une seule.

    * Une "classe" est une unité d'organisation du code. La question du découpage en classes et modules est une question d'organisation du code. A priori je te recommande d'avoir un contrôle spécifique pour chacune des sous-parties de l'interface utilisateur. Un contrôle est une classe représentant une UI.

    * Un "thread" est un "fil" d'exécution. Plusieurs threads peuvent s'exécuter simultanément. C'est une question d'exécution concurrente. C'est un sujet très compliqué donc contente-toi dans la mesure du possible de n'avoir qu'un seul thread, le thread UI. Toutefois si tu devais faire des opérations longues, il ne faut pas les faire sur le thread UI car cela bloquerait l'UI. Dans ce cas je te recommande d'attendre sur un autre thread, qui ne fera qu'attendre, puis de traiter les données reçues sur le thread UI. Certaines méthodes d'interaction avec le réseau se chargent de faire cela automatiquement (méthodes async).

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    chomeur
    Inscrit en
    Février 2014
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Février 2014
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    re bonjour

    donc tu me recommande de faire une classe pour l acces au reseau et une classe pourl acces a mysql ?
    ---------------
    la classe mysql

    sub ecrire_base()
    bla bla pour le insert
    end sub

    sub update_base()
    ici on update
    end sub

    sub lecture_base()
    ici on lit
    exit sub
    ------------------
    et dans la classe acces reseau
    ------
    sub connexion ()
    bla bla , ici on lance le thread pour etre en asyncrone ? et la mise en attente de connexion ?
    end sub

    sub recoie_les_data()
    call update base() ici on fait l update qui est dans l autre classe ?
    call envoie_les_data()
    end sub

    sub envoie_les_data()
    ici on envoie les datas
    end sub

    mais comment faire pour que mes variables soit utiliser par les 2 classes et le form en meme temps !!
    sans que l on me dise qu il faut un delegate ou comment appeler le delegate du form ou de la classe qui veux modifier le texte ?
    c ets al que je patauge !!

    merci

  4. #4
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    C'est beau, voir téméraire d'apprendre à programmer sans passer par la case "je lis un cours"...

    Voir même de demander des informations sur un forum sans connaitre les bases, les gens vont vite se lasser, si on arrive pas à se comprendre.

    Donc :

    http://plasserre.developpez.com/cours/vb-net/?page=poo1
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par toufou42 Voir le message
    en suivant le cours de phillipe, j ai pas mal evoluer (par rapport a vb6)
    ne pas le prendre mal, mais à la lecture de la suite de ton post je n'en dirais pas autant ...

    pour faire simple par rapport aux threads, quand tu fais F10 une fois sur un point d'arrêt tu vois ta barre jaune qui te montre la ligne exécutée actuellement avancer d'une ligne
    et bien sur tu créés un autre thread tu auras l'équivalent d'une autre barre jaune à un autre endroit, et les 2 avanceront en même temps

    donc si on a un programme qui doit faire plein de choses en même temps, autant avoir plein de threads oui
    c'est aussi utile pour faire de l'asynchronisme, par exemple tu vas lire quelque chose dans une base de données, ca peut prendre plusieurs centaines de millisecondes, c'est dommage d'attendre à rien faire pendant ce temps là

    un thread démarre sur une sub et s'arrête à la fin de celle ci (sauf si on fait un while true dans la sub)

    mais bon en parallèle je pense que tu as d'autres notions à revoir pour recoder ce que tu déjà fais
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonjour,
    Je rebondi sur ce sujet, j'espère que toufou42 m'en voudra pas.
    Je me suis toujours demandé comment était piloté les programmes dans les jeux vidéo. On est bien d'accord que la plupart du temps en .NET le programme ne fait rien et attend un événement utilisateur. Dans les jeux vidéos on a plusieurs moteur ou calculs indépendant, par exemple j'ai entendu dire que dans une simu auto on a un moteur qui gère les collisions à 60Hz, un moteur pour le Tire Model à 300Hz, un moteur Suspension Model à 3000Hz.
    En général le programme est en C++ (j'imagine pour des questions de performance), mais comment on contrôle ces fréquences de calculs en fait ? Ce sont l'équivalents de timer qui lance les calculs ?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    chomeur
    Inscrit en
    Février 2014
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Février 2014
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    merci à vous 2

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par BasicZX81 Voir le message
    Je me suis toujours demandé comment était piloté les programmes dans les jeux vidéo. On est bien d'accord que la plupart du temps en .NET le programme ne fait rien et attend un événement utilisateur ?
    un jeu vidéo n'est pas vraiment évènementiel, à la base c'est une boucle infinie (équivalent d'un while true)
    à chaque tour un peut tester l'état du clavier (ou autre entrée) et agir en conséquence

    de nos jours j'imagine qu'il y a plusieurs threads dédiés à chaque tâche (input, traitement, calculs, rendu, réseau ...)
    et avec un while true + un thread.sleep(pas grand chose) on arrive à faire un truc qui ressemble à timer en effet


    mais bon windows c'est pareil, c'est un truc qui boucle et quand il voit que souris.boutongauche est cliqué, il chercher la fenetre active, lui accole un message, l'appli .net vient lire ce message (cf pompe à message de windows) et te lève un évènement .net
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    chomeur
    Inscrit en
    Février 2014
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Février 2014
    Messages : 27
    Points : 25
    Points
    25
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    Imports MySql.Data.MySqlClient
    Imports System.Net.Sockets
    Imports System.Net
    Imports System.Threading
    
    Public Class Form1
        Dim sermysqltest As String
        Dim droit As String
        Dim passeadmi As String
        Dim database As String
        Dim connectionglobal
        Dim port As String = "203"
        Dim ip As String = "127.0.0.1"
        Public id As Object
    
        Structure acceuilclient
            Dim id_ac As Integer
            Dim nom_ac As String
            Dim passe_ac As String
            Dim mel_ac As String
            Dim date_ac As String
            Dim heure_ac As String
        End Structure
    
        Dim joueurs
    
        Dim joueur As String
        Dim url_joueur As String
        Dim pos_joueur As String
        Dim rot_joueur As String
        Dim action_avat_joueur As Integer
        Public Sub SQL
            sermysqltest = "127.0.0.1"
            droit = "root"
            passeadmi = ""
            database = "mabase"
    
    
        End Sub
    
        Public Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
        End Sub
        Sub MonThread()
            Dim MonSocketServeur As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            Dim MonEP As IPEndPoint = New IPEndPoint(IPAddress.Parse(ip), port)
            MonSocketServeur.Bind(MonEP) 'Lie le socket à cette IP
            MonSocketServeur.Listen(1) 'Se met en mode écoute
            Label3.Text = "CONNEXION EN ATTENTE"
            Dim SocketEnvoi As Socket = MonSocketServeur.Accept() 'Bloquant tant que pas de connexion
            imagechat.BackColor = Color.Green
            Label3.Text = "CONNEXION REUSSIE"
    
        End Sub
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Call SQL()
            Dim serveurgeneral As String = "Database=" + database + ";Data Source=" + sermysqltest + ";User Id=" + droit + ";Password=" + passeadmi
            Dim myConnection As New MySqlConnection(serveurgeneral)
            Try
                myConnection.Open()
            Catch
                Label2.Text = "Serveur non joignable"
                imagesql.BackColor = Color.Red
                Exit Sub
    
            End Try
            imagesql.BackColor = Color.Green
            Label2.Text = "BASE MYSQL EN SERVICE"
    
        End Sub
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    
            Dim serveurgeneral As String = "Database=" + database + ";Data Source=" + sermysqltest + ";User Id=" + droit + ";Password=" + passeadmi
    
            Dim myConnection As New MySqlConnection(serveurgeneral)
            myConnection.Close()
            imagesql.BackColor = Color.Red
            Label2.Text = "BASE MYSQL HORS SERVICE"
        End Sub
        Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
            If Label2.Text <> "BASE MYSQL EN SERVICE" Then
                Label2.Text = "BASE MYSQL HORS SERVICE" + Chr(13) + "OPTIMIZATION IMPOSSIBLE"
                Exit Sub
            End If
    
            imagesql.BackColor = Color.Orange
            Dim v(10)
            Dim serveurgeneral As String = "Database=" + database + ";Data Source=" + sermysqltest + ";User Id=" + droit + ";Password=" + passeadmi
            Dim optimize As String = "OPTIMIZE TABLE joueur;"
            Dim myConnection As New MySqlConnection(serveurgeneral)
            Dim myCommand As New MySqlCommand(optimize)
            Dim requete2 As String = "OPTIMIZE TABLE joueur;"
            Dim cmd As MySqlCommand = New MySqlCommand(requete2, myConnection)
            cmd.CommandText = optimize
            Label2.Text = "OPTIMIZATION DE LA BASE MSQL"
            Timer1.Start()
    
    
    
        End Sub
        Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
            imagesql.BackColor = Color.Green
            Label2.Text = "BASE MYSQL EN SERVICE"
    
            Timer1.Stop()
            Exit Sub
        End Sub
    
        Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
            'Crée le socket et l'IP EP
            Dim MonSocketServeur As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            Dim MonEP As IPEndPoint = New IPEndPoint(IPAddress.Any, port)
            Try
                MonSocketServeur.Bind(MonEP) 'Lie le socket à cette IP
                MonSocketServeur.Listen(1) 'Se met en écoute
                imagechat.BackColor = Color.SeaGreen
    
    
            Catch ex As Exception
                Label3.Text = ex.ToString
    
    
            End Try
    
    
        End Sub
    
        Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
            Dim MonSocketServeur As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            Dim MonEP As IPEndPoint = New IPEndPoint(IPAddress.Parse(ip), port)
    
            MonSocketServeur.Close()
            imagechat.BackColor = Color.Red
            Label3.Text = "SERVEUR CHAT ETEINT"
        End Sub
    
        Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
            Dim serveurgeneral As String = "Database=" + database + ";Data Source=" + sermysqltest + ";User Id=" + droit + ";Password=" + passeadmi
    
            Dim myConnection As New MySqlConnection(serveurgeneral)
            Try
                myConnection.Open()
            Catch
                Label2.Text = "Serveur non joignable"
                imagesql.BackColor = Color.Red
                Exit Sub
    
            End Try
            imagesql.BackColor = Color.Green
            Label2.Text = "BASE MYSQL EN SERVICE"
            Timer2.Start()
    
    
    
        End Sub
    
        Public Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
            Dim serveurgeneral As String = "Database=" + database + ";Data Source=" + sermysqltest + ";User Id=" + droit + ";Password=" + passeadmi
    
            Dim myConnection As New MySqlConnection(serveurgeneral)
            myConnection.Close()
            imagesql.BackColor = Color.Red
            Label2.Text = "BASE MYSQL HORS SERVICE"
    
            Dim MonSocketServeur As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            Dim MonEP As IPEndPoint = New IPEndPoint(IPAddress.Parse(ip), port)
    
            MonSocketServeur.Close()
            imagechat.BackColor = Color.Red
            Label3.Text = "SERVEUR CHAT ETEINT"
    
        End Sub
    
        Private Sub GroupBox4_Enter(sender As Object, e As EventArgs) Handles GroupBox4.Enter
    
        End Sub
    
        Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
            cc3d.url = "http://www.starenda.info/3d/no_cache/debut.wrl"
        End Sub
    
        Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
            cc3d.url = "/debut.wrl"
            ' deux boutons pour la meme choses, NA
            ' joueurs(id) = 0
    
    
    
    
    
        End Sub
    
        Public Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
            Dim serveurgeneral As String = "Database=" + database + ";Data Source=" + sermysqltest + ";User Id=" + droit + ";Password=" + passeadmi
    
            Dim myConnection As New MySqlConnection(serveurgeneral)
    
            Try
                myConnection.Open()
            Catch
                Label2.Text = "Serveur non joignable"
                imagesql.BackColor = Color.Red
                Exit Sub
    
            End Try
            imagesql.BackColor = Color.GreenYellow
    
            Label2.Text = "BASE MYSQL EN SERVICE"
    
    
        End Sub
    End Class
    bon voila mon code
    ca vous aide deja plus ?
    une fois le thread lancé et ouvert et une fois connecté, c est la que je sais plus quoi faire et ou mettre le reste !!
    le client se connecte bien, mon carre passe au vert, mais apres que faire ?
    et surtout ou ?
    et aussi comment faire pour eviter les doublons comme celui fait en rouge ? en basic on faisait un gosub, et le return le renvoyait la ou il etait en vb6, j y arrivait mais la !!
    Nom : question2.png
Affichages : 380
Taille : 36,5 Ko

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    je confirme, il faut revoir certaines choses dont la POO

    ton code sql, ton code tcp et ton code de gestion du jeu n'ont rien à faire sur la classe Form1
    tes boutons qui s'appellent button1, button2 ... c'est à proscrire, tu leur donnes un nom explicite
    même ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        Dim joueur As String
        Dim url_joueur As String
        Dim pos_joueur As String
        Dim rot_joueur As String
    c'est limite en .net
    si un joueur se définit par plusieurs choses, tu fais une classe Joueur avec des propriétés

    se détacher de vb6 et de la programmation procédurale n'est pas forcément évident je le concède, mais il faut apprendre ce qu'est une classe, une instance, le polymorphisme, les interfaces (pas dans le sens d'interface graphique, mais dans le sens de schéma de membres d'une classe), les factory, les singleton etc...

    (le choix de mysql est discutable aussi)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    chomeur
    Inscrit en
    Février 2014
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Février 2014
    Messages : 27
    Points : 25
    Points
    25
    Par défaut voila c est ce que je voualis savoir !!!
    Merci la j avance pas mal dans ce que tu viens de me dire

    par contre pourquoi mysql est un mauvais choix ?
    les acces sont correct et j arrvie a faire ce que je veux sur al base de donnes !!

  12. #12
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    si tu t'en sors avec mysql, et que tu le connais, tu peux rester dessus, ca te fera une chose de moins à apprendre en même temps que le reste
    il reste largement utilisable (et largement utilisé quand même)

    mysql est peu performant, ne respecte pas les normes, ne permet pas plein de choses utiles et sécurisantes ...
    ce qu'en pense un pro : http://blog.developpez.com/sqlpro/p9...oudre_aux_yeux
    pour un non initié il y a peut être du jargon étrange dans ce billet, mais ne connaissant pas spécialement mysql certains points m'ont effrayé ^^

    sql server express est gratuit et largement au dessus de ça
    après si tu as peu de données et que tous les accès sont en local, des choses comme sqlite feraient aussi l'affaire
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    chomeur
    Inscrit en
    Février 2014
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Février 2014
    Messages : 27
    Points : 25
    Points
    25
    Par défaut encore une question bete
    sql serveur express est similaire a sql serveur de windows serveur 2012 r2 ?
    je peux developper avec sql serveur express ?

  14. #14
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ta question ne veut pas dire grand chose
    sql server est un logiciel de gestion de base de données, qui existe en plusieurs versions
    express est gratuit (maxi 10Go par base de données et quelques autres restrictions)
    après il y a la version standard et la version entreprise

    que tu l'installes sur un windows server ou windows normal ça ne change pas grand chose (enfin un OS server est plus robuste mais c'est tout)

    après comme toute base de données réseau la question du déploiement peut se poser (ce n'est pas une base de données fichier comme access ou sqlite)


    concernant "je peux développer avec sql server express ?" là non plus je ne comprends pas trop la question
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  15. #15
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Citation Envoyé par toufou42 Voir le message
    donc tu me recommande de faire une classe pour l acces au reseau et une classe pourl acces a mysql ?
    Oui, il est bon de séparer réseau, UI, base de données et logique du jeu. Ce sont quatre niveaux différents que l'on peut bien encapsuler (on peut masquer l'essentiel de la plomberie nécessaire à chacune de ces couches pour que les autres couches n'aient pas à s'en soucier). Et certains de ces niveaux devront à leur tour être divisés.

    mais comment faire pour que mes variables soit utiliser par les 2 classes et le form en meme temps !!
    sans que l on me dise qu il faut un delegate ou comment appeler le delegate du form ou de la classe qui veux modifier le texte ?
    Mais elles ne doivent pas partager les données puisque le principe est d'encapsuler. Et elles n'en ont pas besoin.

    Par exemple la couche réseau reçoit un message "joueur X a accepté quête Y". Le rôle de la couche réseau est alors de signaler au reste du monde cet événement, pas de le traiter. Cela peut se faire par un événement, par une interface, pas un délégué. Peu importe. Ce qui est important c'est que ce qu'il faut faire avec cet événement n'est pas de la responsabilité de la couche réseau. Cela relève de la logique du jeu, pas du réseau. Donc le réseau n'a pas besoin des données du jeu.

    De même la base de données n'a pas besoin de connaître l'état du jeu. Tout ce dont elle a besoin c'est d'exposer des méthodes basiques comme EnregistrerQuête(idJoueur, idQuête, statut). Ces méthodes ne concernent pas la logique du jeu, seulement leur lecture/écriture dans la base.

    Pour l'UI c'est un peu plus compliqué. C'est le jeu qui signalera à l'UI qu'elle doit être rafraîchie mais celle-ci doit ensuite lire les données du jeu pour les afficher. On pourrait lui communiquer toutes les données qui ont changées et alors l'UI n'aurait plus besoin d'aller lire l'état du jeu. C'est une bonne stratégie pour les grosses applications qui dureront longtemps et connaîtront beaucoup de changements (voir MVC et MVVM). Mais pas pour un petit jeu, ce serait disproportionné. Donc, oui, il faudra partager. Par exemple l'UI pourrait avoir une référence vers la classe représentant le jeu.


    Citation Envoyé par Pol63 Voir le message
    donc si on a un programme qui doit faire plein de choses en même temps, autant avoir plein de threads oui
    Je ne suis pas d'accord. Vu la complexité et les bugs que cela entraîne il faut autant que possible rester sur un seul thread, à plus forte raison avec les anciens langages comme C# qui ne sont pas capables de détecter des partages involontaires et non-protégés de données. C'est vrai pour un pro chevronné et c'est encore plus vrai pour un débutant.

    On n'utilisera plusieurs threads que si l'on est confronté à des problèmes de performances ou si certains traitements doivent durer plus de quelques dizaines de millisecondes, pour ne pas bloquer l'UI.


    Citation Envoyé par BasicZX81 Voir le message
    Je me suis toujours demandé comment était piloté les programmes dans les jeux vidéo. On est bien d'accord que la plupart du temps en .NET le programme ne fait rien et attend un événement utilisateur. Dans les jeux vidéos on a plusieurs moteur ou calculs indépendant, par exemple j'ai entendu dire que dans une simu auto on a un moteur qui gère les collisions à 60Hz, un moteur pour le Tire Model à 300Hz, un moteur Suspension Model à 3000Hz.
    En général le programme est en C++ (j'imagine pour des questions de performance), mais comment on contrôle ces fréquences de calculs en fait ? Ce sont l'équivalents de timer qui lance les calculs ?
    Dans le jeu vidéo on raisonne avant tout par images. On relève les entrées (boutons pressés), on réagit, on calcule l'état du monde, puis on affiche. Et on recommence. Une bête boucle.

    Bien sûr il y a plusieurs threads en parallèle : un ou plusieurs pour le rendu, un ou plusieurs pour la physique, un ou plusieurs pour le gameplay, etc. Mais en général tout ce petit monde se synchronise à chaque image (le moteur de gameplay va demander au moteur de physique de lui signaler les changements depuis la dernière image puis de démarrer la prochaine).

    Concernant les fréquences dont tu parles c'est encore autre chose : un moteur de physique calcule l'évolution du monde entre deux instants t et t + dt. Si dt est trop important alors des aberrations vont se produire : deux objets vont par exemple se croiser sans se rentrer dedans. Donc il faut un pas de temps (dt) suffisamment petit. Mais le moteur va simplement effectuer N itérations successives en une seule passe, le thread ne s'endormira pas entre deux itérations, seulement entre deux images.


    Citation Envoyé par Pol63 Voir le message
    un jeu vidéo n'est pas vraiment évènementiel, à la base c'est une boucle infinie (équivalent d'un while true)
    à chaque tour un peut tester l'état du clavier (ou autre entrée) et agir en conséquence
    A vrai dire c'est très semblable à une UI : le moteur de jeu et le moteur de l'UI ont une boucle infinie qui pompe les messages et dispatche ensuite aux objets concernés par le clic, la collision, etc.

    La grosse différence c'est que le moteur de jeu a des événements récurrents à chaque image (update, render, lecture des changements par le moteur physique), qu'il se réveillera donc automatiquement et que les messages seront toujours pompés au début de l'image. Mais finalement c'est un peu comme si sous WinForms tu ajoutais un timer chargé de lancer Update et Render toutes les 15ms.

    Enfin là où une UI presume qu'il n'y a aucun changement et doit être marquée comme "sale" pour nécessiter un nouveau rendu, un jeu présume au contraire qu'il y a des changements et lancera toujours le rendu et le reste.

  16. #16
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par DonQuiche Voir le message
    Je ne suis pas d'accord. Vu la complexité et les bugs que cela entraîne il faut autant que possible rester sur un seul thread, à plus forte raison avec les anciens langages comme C# qui ne sont pas capables de détecter des partages involontaires et non-protégés de données. C'est vrai pour un pro chevronné et c'est encore plus vrai pour un débutant.

    On n'utilisera plusieurs threads que si l'on est confronté à des problèmes de performances ou si certains traitements doivent durer plus de quelques dizaines de millisecondes, pour ne pas bloquer l'UI.
    ca me parait être une approche assez ancienne, sur un serveur on a parfois 48 coeurs, notre appli serveur a plusieurs dizaines de threads, sans ca il nous faudrait 8GHz
    et l'évolution va dans ce sens, ca fait des années qu'on ne dépasse pas 4GHz et intel nous parle bien d'un futur avec des centaines de coeurs

    donc rester sur un thread je ne suis pas du tout d'accord
    certes le multithreading peut poser des tas de problèmes, mais comme tout en programmation, il suffit de savoir ce qui peut arriver et d'utiliser les outils pour éviter les problèmes (lock, readerwriterlock ...)

    même pour du traitement de données, avec du parallélisme on divise le temps quasiment par le nombre de coeurs
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  17. #17
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    ca me parait être une approche assez ancienne, sur un serveur on a parfois 48 coeurs, notre appli serveur a plusieurs dizaines de threads, sans ca il nous faudrait 8GHz
    Autrement dit tu es dans un cas où tu as un problème de performances et où tu dois utiliser le multithreading. Malgré tous les risques et les coûts que cela représente. Et tu as alors raison de l'utiliser.

    Mais ma réponse sera toujours la même lorsque nous aurons douze millions de cœurs : si tu peux t'en passer, passe t-en.


    certes le multithreading peut poser des tas de problèmes, mais comme tout en programmation, il suffit de savoir ce qui peut arriver et d'utiliser les outils pour éviter les problèmes (lock, readerwriterlock ...)
    Oui.

    Jusqu'au jour où quelqu'un va utiliser une des données normalement protégées par ce verrou sans verrouiller.
    Ou qu'il utilisera des données non-protégées parce qu'elles n'étaient pas partagées jusque là et qui le sont désormais par inadvertance.
    Ou que tu auras besoin d'utiliser conjointement des données protégées par deux verrous différents et que les consommateurs rapporteront que l'application gèle une fois tous les trente-six du mois.
    Ou que tu placeras un await dans un callback appelé, sans que tu le saches, depuis l'intérieur d'un verrou.
    Ou que quelqu'un se dira que ces deux champs peuvent être lus dans cet ordre sans verrouillage sans se rendre compte que leur ordre pourrait être inversé par le CPU.
    Ou que ton site rame parce que l'un de tes threads à haute priorité partage un verrou avec des threads à basse priorité.

    De base le compilateur ne t'offre aucune vérification pour tout cela et les outils de vérification statique standards rapportent mille faux positifs pour un vrai problème tout en passant à côté de tous ceux qui importent. Au moins les langages récents permettent t-ils de détecter des partages inattendus.

    Donc non il ne suffit pas d'utiliser un ou deux verrous. Il faut aussi mettre en place une armée de mécanismes de défense pour détecter les futurs problèmes, expliciter la concurrence, documenter et faire lire la doc, former les gens sur ce sujet complexe sur lesquels ils sont trop peu formés, etc. Et tu te taperas quand même du heisenbug. Et personne n'osera intervenir là-dessus sauf ceux qui en savent trop peu pour leur propre bien.

    Tout ça coûte de l'argent.

  18. #18
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Tout ceci est très intéressant.
    Petite question : Si on développe un programme sur un seul Thread, est ce que Windows est assez malin pour répartir la charge sur plusieurs cœurs ou pas ?

  19. #19
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par BasicZX81 Voir le message
    Tout ceci est très intéressant.
    Petite question : Si on développe un programme sur un seul Thread, est ce que Windows est assez malin pour répartir la charge sur plusieurs cœurs ou pas ?
    bah non
    en pratique ton thread risque d'être baladé de coeur en coeur, mais ca ne change rien au fait que c'est du monothread
    sinon personne ne s’embêterait à coder en multithread ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  20. #20
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    bah non
    en pratique ton thread risque d'être baladé de coeur en coeur, mais ca ne change rien au fait que c'est du monothread
    sinon personne ne s’embêterait à coder en multithread ...
    Ah ok, C'est ce que je me disait

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. Réponses: 16
    Dernier message: 30/01/2004, 11h05
  3. [VB6][active x] faire du multi-thread avec vb
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/05/2003, 12h01
  4. [Kylix] exception qtinft.dll et multi-threading
    Par leclaudio25 dans le forum EDI
    Réponses: 3
    Dernier message: 27/03/2003, 18h09
  5. Pouvez vous m'aider a resoudres ces 3 exercices
    Par algorithmique dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 09/08/2002, 17h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo