Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Rédacteur/Modérateur
    Avatar de Trap D
    Inscrit en
    septembre 2003
    Messages
    4 517
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 4 517
    Points : 5 408
    Points
    5 408

    Par défaut Thread en mode STA ?

    Bonjour

    Je découvre F# avec Visual Studio et j'étudie des codes existants, certains sont extraits de fichiers de scripts (?) .fsx.
    J'ai réussi à en traduire un en programmes F# pour Visual Studio mais il plante au moment de la création d'une fenêtre.
    Je livre le début du code :
    Code :
    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
    //Author: Scott Brown
    //10/10/2010
    //This code is licensed under the Code Project Open License (CPOL)
    // #r "WindowsBase"
    // #r "PresentationCore"
    // #r "PresentationFramework"
    open System
    open System.Windows
    open System.Windows.Markup
    open System.Windows.Controls
    open System.Windows.Shapes
    open System.Windows.Media
    open System.Xml
    open System.Collections.Generic
                     
    //Make a Canvas subclass which supports ScrollViewer
    type ScrollableCanvas() = 
        inherit Canvas()
        override canvas.MeasureOverride  limit: Size =
           let availableSize = new Size(1000000., 1000000.)
           let mutable maxHeight = 0.
           let mutable maxWidth  = 0.
           for element : UIElement in base.InternalChildren do
                if element <> null then 
                   element.Measure(availableSize) |> ignore
                   let mutable left = Canvas.GetLeft(element) 
                   let mutable top  = Canvas.GetTop(element)
                   left <- left + element.DesiredSize.Width
                   top <- top +  element.DesiredSize.Height
                   maxWidth <- if maxWidth < left then left else maxWidth
                   maxHeight <- if maxHeight < top then top else maxHeight
           let newSize = new Size(Width=maxWidth, Height=maxHeight)
           newSize    
    
    let w = new Window(Topmost=true)
    La fenêtre w ne se créée pas et j'ai ce message :
    Exception non gérée : System.InvalidOperationException : Le thread appelant doit être en mode STA comme l'exigent de nombreux composants de l'interface utilisateur.
    Si j'étais en C ou en C++ je pense que CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) aurait suffi a résoudre le problème mais en F# ?

    Merci
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : Intérieur avec jeune femme de Vilhelm Hammershoi

  2. #2
    LLB
    LLB est déconnecté
    Membre Expert
    Inscrit en
    mars 2002
    Messages
    962
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 962
    Points : 1 160
    Points
    1 160

    Par défaut

    Pour utiliser System.Forms, il faut que le point d'entrée ait l'attribut STAThread. Essaie ceci :

    Code :
    1
    2
    3
    4
    [<STAThread>]
    do
      let w = new Window(Topmost=true)
      ()
    Le bloc qui commence avec do correspond alors à ta fonction main du C.

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Inscrit en
    septembre 2003
    Messages
    4 517
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 4 517
    Points : 5 408
    Points
    5 408

    Par défaut

    Merci ça fonctionne bien

    Ça m'a permis de voir qu'il y a une grande différence entre l'écriture d'un script où tout me parait mis un peu n'importe comment et ça marche et l'écriture d'un programme où il faut respecter une certaine logique. C'est mes premières impressions, ça va peut-être changer.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : Intérieur avec jeune femme de Vilhelm Hammershoi

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •