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

  1. #1
    Expert éminent sénior
    [Linux -- gtk2] Le sablier ne peut parfois pas être affiché
    Bonjour,

    Le marronnier du sablier : il m'est parfois impossible de changer l'image du pointeur de ma souris en sablier (ou autre), un grand classique.

    Ou plutôt, un truc tout bête fonctionne :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Screen.Cursor:=crHourGlass;// ok 
      Application.ProcessMessages;
      OpenDialog1.Execute
      Screen.Cursor := crDefault;
    end;


    mais avec un truc sophistiqué c'est mort :
    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
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if not OpenDialog1.execute then exit;
     
      stream := Bass_StreamCreateFile(False, pChar(od.filename), 0, 0, BASS_STREAM_DECODE); // Make a decoding stream
      // Decode the sample data, without playing it. Use BASS_ChannelGetData to retrieve decoded sample data.
      if stream = 0 then begin // testé ok
        Error('Error creating stream for ' + OpenDialog1.FileName);
        Exit;
      end;
      BASSChannelGetLength := BASS_ChannelGetLength(stream, BASS_POS_BYTE);
      if BASSChannelGetLength = QW_ERROR then begin // testé ok
        Error('Error getting length of ' + OpenDialog1.FileName);
        Exit;
      end;
     
      Screen.Cursor:=crHourGlass; // jamais vu le sablier
      Application.ProcessMessages;
      Splitter1Moved(Self);
      GetDataAndShowBmps;
      Screen.Cursor := crDefault;
    end;
    Ci-dessous une magnifique capture d'écran où j'ai activé la présence du pointeur, en plein milieu de la trace laissée par l'OpenDialog.


    Bien sûr j'ai googlé, mais comm' d'hab', ça ne paye pas pour ce genre de problème : j'ai même vu un post qui disait que si l'exemple des curseurs (fourni avec Laz [version\examples\cursors]) fonctionnait, alors le problème était dans mon camp. OK, mais où ?

    Et le gag (car, oui, il y en a un), c'est que mon code fonctionne si je valide la boîte de dialogue de l'OpenDialog avec la touche ENTER !
    Mais si je clique à la souris sur "Ouvrir", c'est mort.

    Une idée, quelqu'un ?

    Linux 32 bits, Lazarus (encore et toujours) 1.4, gtk2.8.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Membre expert
    Salut JP, question bête mais pourquoi n'as tu pas mis le changement de curseur après OpenDialog.Execute ??

    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
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if not OpenDialog1.execute then exit;
     
      // ICI PAR EXEMPLE, juste avant des tes méthodes de traitement 
      Screen.Cursor:=crHourGlass; // jamais vu le sablier
      Application.ProcessMessages;
     
      // petit truc, si jamais, tu peux placer un sleep(300); ou Sleep(500); ici juste après le Application.ProcessMessages, 
      // ce qui laissera juste le temps à l'UI de se mettre à jour avant de passer aux choses sérieuses.
      // J'utilise parfois cette petite astuce, lorsque j'ai besoins que mon UI soit mise à jour, 
      // juste avant de lancer de gros traitements qui bouffent tout le CPU
     
      // Tes méthodes qui te bouffent le cpu au max
      stream := Bass_StreamCreateFile(False, pChar(od.filename), 0, 0, BASS_STREAM_DECODE); // Make a decoding stream
      //.....
     
      Splitter1Moved(Self);
      GetDataAndShowBmps;
      Screen.Cursor := crDefault;
    end;


    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  3. #3
    Expert éminent sénior
    Ce message n'a pas pu être affiché car il comporte des erreurs.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #4
    Membre expert
    Citation Envoyé par Jipété Voir le message
    Yep, Jérôme !


    Parce qu'il y a des tests suivis d'"Exit" si erreur.
    Dans ce cas le mieux serait de blinder le code de try..finally..except ou plus simple

    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
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if not OpenDialog1.execute then exit;
     
      Screen.Cursor:=crHourGlass; 
      Application.ProcessMessages;
      sleep(300);
     
      stream := Bass_StreamCreateFile(False, pChar(od.filename), 0, 0, BASS_STREAM_DECODE);
      if stream <> 0 then
      begin
        BASSChannelGetLength := BASS_ChannelGetLength(stream, BASS_POS_BYTE);
        if BASSChannelGetLength <> QW_ERROR then 
        begin 
          Splitter1Moved(Self);
          GetDataAndShowBmps;      
        end
        else
        begin
          Screen.Cursor := crDefault;
          Error('Error getting length of ' + OpenDialog1.FileName);  // Je suppose que cela t'affiche une boite de dialogue, sinon la ligne du dessus n'est pas obligatoire
        end;
      end
      else
      begin
         Screen.Cursor := crDefault;
         Error('Error creating stream for ' + OpenDialog1.FileName);
      end;
      Screen.Cursor := crDefault;
     end;



    Citation Envoyé par Jipété Voir le message

    Comment le sais-tu ?
    Tu peux le voir dans sous Linux si je me souviens bien c'est dans le module de configuration du systeme, tu peux voir la mémoire et l'utilisation du cpu. De plus lorsque l'ui "freeze" c'est un des signes. Le truc c'est que le message envoyé par "application.ProcessMessages" n'a pas le temps de s'executer, car la méthode qui le suit, s'accapare tout le cpu, du coup le message est en attente, voir ignoré à la fin du traitement.
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  5. #5
    Expert éminent sénior
    Citation Envoyé par BeanzMaster Voir le message
    ou plus simple
    Bien joué !
    Tu as pris le problème à l'envers de ma manière à moi de faire, et c'est bon.


    Citation Envoyé par BeanzMaster Voir le message
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
      // Tes méthodes qui te bouffent le cpu au max
      stream := Bass_StreamCreateFile(False, pChar(od.filename), 0, 0, BASS_STREAM_DECODE); // Make a decoding stream
    Citation Envoyé par Jipété Voir le message
    Comment le sais-tu ?
    Citation Envoyé par BeanzMaster Voir le message
    Tu peux le voir sous Linux, si je me souviens bien c'est dans le module de configuration du systeme, tu peux voir la mémoire et l'utilisation du cpu. De plus lorsque l'ui "freeze" c'est un des signes.
    D'accord, mais comment faire autrement, si j'ai besoin de Bass_StreamCreateFile ?
    Je pourrais essayer de faire afficher bouts par bouts mais l'effort ne vaut pas le coup.

    En fait j'ai besoin d'un bête outil qui m'affiche ce qu'il y a dans un .wav (ou .mp3) pour le comparer avec Audacity -- car il m'arrive des trucs bizarres, genre je règle bien Audacity pour enregistrer depuis la chaîne hifi [je sais enregistrer depuis l'arrivée des magnétos à k7, ça nous rajeunit pas…], et une fois l'enregistrement terminé et le fichier sauvegardé, ben, les données ne sont pas bonnes, genre saturées, un truc que je n'aurais jamais laissé passer si je l'avais vu au moment où ça enregistrait.

    Et ça, je ne comprends pas.

    En attendant, le problème du sablier est , merci à toi et bon dimanche,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Membre expert
    Citation Envoyé par Jipété Voir le message
    Bien joué !

    D'accord, mais comment faire autrement, si j'ai besoin de Bass_StreamCreateFile ?
    Je pourrais essayer de faire afficher bouts par bouts mais l'effort ne vaut pas le coup.
    Est-ce vraiment cette fonction qui bouffe tout ?

    Une moyen simple, est de prendre une mesure de temps

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Start = getTickCount64;
    MaMethode;
    Stop = getTickCount64;
    Elapsed := Stop - Start;
    writeln('Ma Fonction : ',Elapsed); // Affichage dans la console


    Là tu verras tout de suite la méthode qui prend le plus de temps.

    Citation Envoyé par Jipété Voir le message

    En fait j'ai besoin d'un bête outil qui m'affiche ce qu'il y a dans un .wav (ou .mp3) pour le comparer avec Audacity -- car il m'arrive des trucs bizarres, genre je règle bien Audacity pour enregistrer depuis la chaîne hifi [je sais enregistrer depuis l'arrivée des magnétos à k7, ça nous rajeunit pas…], et une fois l'enregistrement terminé et le fichier sauvegardé, ben, les données ne sont pas bonnes, genre saturées, un truc que je n'aurais jamais laissé passer si je l'avais vu au moment où ça enregistrait.

    Et ça, je ne comprends pas.

    En attendant, le problème du sablier est , merci à toi et bon dimanche,
    Pour le coup, tu devrais régler les niveaux d'entrées de ta carte son, soit si c'est possible dans Audiacity soit dans le panneau de configuration audio. C'est comme avec le micro, si tu as un volume d'enregistrement trop haut, ça sature

    A+

    Bon dimanche
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  7. #7
    Expert éminent sénior
    Citation Envoyé par BeanzMaster Voir le message
    Est-ce vraiment cette fonction qui bouffe tout ?
    Ben c'est toi qui l'avais écrit, mais en effet, avec ton petit chronomètre je me rends compte que non, ce n'est pas pas la création du stream (et l'ouverture du fichier) qui est chronophage, c'est comme bien souvent les calculs d'affichage et là, je ne peux pas faire grand chose.
    Bon, je ne vais pas me plaindre, l'ouverture d'un fichier de 3 minutes est quasi instantanée, c'est ceux qui sont très longs (près d'une heure) qui prennent quelques secondes.


    Citation Envoyé par BeanzMaster Voir le message
    Pour le coup, tu devrais régler les niveaux d'entrées de ta carte son, soit si c'est possible dans Audacity soit dans le panneau de configuration audio. C'est comme avec le micro, si tu as un volume d'enregistrement trop haut, ça sature
    Quant au son sous Linux, c'est une joyeuse pagaille, j'en ai longuement parlé là sans arriver à rien de définitif.

    In fine, c'est à moi de surveiller tout ça comme le lait sur le feu.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp