Mon IHM est bloqué et je veut cliquer :-(

nerone21 Messages postés 108 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 5 mai 2011 - 4 janv. 2007 à 11:31
nerone21 Messages postés 108 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 5 mai 2011 - 4 janv. 2007 à 15:39
Bonjour a vous les codeurs et bonne année bien sur!

alors ti probleme assez recurent mais j'ai beau parcourir le forum je comprend pas.

De maniere général je ne comprend pas la facon et a quel occasion utiliser les threads ou les timers mais je sais que dans mon probleme actuel je vais en avoir besoin,

je suis en train de creer une appli qui utilise une fonction de recherche dans les dossiers certains type de fichiers, jusque la tout va bien, mon ihm se separe en 2 boites de dialogues:

- la premiere qui permet de determiner quoi et où chercher
- la deuxieme qui est celle de recherche et donc c'est dans la deuxieme que j'ai un probleme:

la recherche s'effectue dés l'initialisation de la deuxieme fenetre mais si par un malheureux hasard de mon envie, je veut appuyer sur un bouton "arret recherche" et bien je ne peut pas car la fenetre est bloqué jusqu'a ce que la fonction de recherche se termine.

et donc en definitive j'aimerais que la fenetre reste active et que je puisse detecter, pendant la recherche, l'appui sur le bouton... alors je suis desolé, je sais que ce genre de questions a été posée des milliers de fois mais malgré mais recherches assidues, je n'ai pas trouvé.

et voila en gros mes fonctions de recherche:

void RechercherFichiers (char NomDossier[MAX_PATH])
{
    WIN32_FIND_DATA Find;
    HANDLE            hFind;
    BOOL            Finished=FALSE;
    char            NomFichier[MAX_PATH*2];
    if (SetCurrentDirectory (NomDossier)==FALSE)
        return;

    // Recherche premier fichier
    hFind=FindFirstFile ("*.*", &Find);
    if (hFind==INVALID_HANDLE_VALUE)
       {
        // pas de fichier
          Finished=TRUE;
    }
    else
    {
        // Fichier trouvé
        wsprintf (NomFichier, "%s%s", NomDossier,Find.cFileName);
        Extens(NomFichier);
    }
    // Les autres fichiers
    while (!Finished)
    {
           if (!FindNextFile (hFind, &Find))
            // Plus de fichier
              Finished=TRUE;
        else
        {
            // Fichier trouvé
            wsprintf (NomFichier, "%s%s", NomDossier,Find.cFileName);
            Extens(NomFichier);
        }
    }

    FindClose (hFind);
}

// Recherche les fichiers textes dans le dossier spécifié
// Cette fonction est récursive, elle s'apelle à chaque fois
// pour évoluer dans la hiérarchie des dossiers
void RechercherDossiers (char NomDossier[MAX_PATH])
{
    WIN32_FIND_DATA Find;
    HANDLE            hFind;
    BOOL            Finished=FALSE;
    char            Buffer[MAX_PATH*2];

    if (SetCurrentDirectory (NomDossier)==FALSE)
        return;

    if (NomDossier[lstrlen(NomDossier)-1]!='\\')
        lstrcat (NomDossier, "\");

    // Recherche les fichiers multimedias du dossier
    RechercherFichiers(NomDossier);

    // Recherche premier sous dossier
    hFind=FindFirstFile ("*.", &Find);
    if (hFind==INVALID_HANDLE_VALUE)
        // Pas de dossier
          Finished=TRUE;
    else
    {
        // Récupère le nom du dossier et lance la recherche si le dossier est valide
        // c'est à dire que c'est bien un dossier, autre que '.' et '..'
        wsprintf(Buffer,"%s%s", NomDossier, Find.cFileName);
        if (DossierValide(&Find))
            RechercherDossiers(Buffer);
    }

    // Recherche les autres dossiers
    while (!Finished)
    {
         if (!FindNextFile (hFind, &Find))
        // Plus de dossier
              Finished=TRUE;
      else
      {
        // Récupère le nom du dossier et lance la recherche si le dossier est valide
        // c'est à dire que c'est bien un dossier, autre que '.' et '..'
        wsprintf(Buffer,"%s%s", NomDossier, Find.cFileName);
        if (DossierValide (&Find))
            RechercherDossiers(Buffer);
      }
    }
    FindClose (hFind);
}

Et l'initialisation de la fenetre de recherche si ca peut servir:
case WM_INITDIALOG:
            nIndex=(int) lParam;
            hWndResults=hWnd;
           
// Affiche la fenêtre
            ShowWindow (hWnd, SW_SHOW);
            UpdateWindow(hWnd);
            NbrFilesINT=0;
            if (nIndex==0)
            {
                // Recherche dans tous les lecteurs
                nCount=(int) SendDlgItemMessage (hWndMain, IDC_LECTEURS, CB_GETCOUNT, (WPARAM) 0, (LPARAM) 0);
                for (i=1;i<nCount;i++)
                {
                    SendDlgItemMessage (hWndMain, IDC_LECTEURS, CB_GETLBTEXT, (WPARAM) i, (LPARAM) (LPCSTR) strDriveSelected);
                    // On veut que par exemple C:\ et pas C:\ [NOM DU VOLUME]
                    strDriveSelected[3]='\0';
                    RechercherDossiers (strDriveSelected);
                }
            }
            else
            {
                // Recherche dans le lecteur spécifié
                SendDlgItemMessage (hWndMain, IDC_LECTEURS, CB_GETLBTEXT, (WPARAM) nIndex, (LPARAM) (LPCSTR) strDriveSelected);
                // On veut que par exemple C:\ et pas C:\ [NOM DU VOLUME]
                strDriveSelected[3]='\0';
                RechercherDossiers (strDriveSelected);
            }
            SetDlgItemText (hWnd, IDC_MESSAGEFIN, "Le programme a trouvé le(s) extension(s) spécifiée(s) dans le(s) fichier(s) suivant(s).\n\nSélectionnez un fichier et cliquez sur Ouvrir pour visualiser le fichier.");
            sprintf(NbrFilesCHAR,"%d",NbrFilesINT);
            strcat(Nbrfile,NbrFilesCHAR);
            postab=0;
            return TRUE;

Merci bien a vous si vous pouvez m'apporter de l'aide.

Bonne continuation.

3 réponses

nerone21 Messages postés 108 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 5 mai 2011
4 janv. 2007 à 11:38
c'est encore moi, j'en profite pdt ke je parle de thread pour aussi demander autre chose:

- mon programme doit s'executer au demarrage de windows avec une recherche direct dés le demarrage et dc comme le processus de recherche est assez lourd pour le processeur, j'aimerais a la limte qu'il s'allume avec un processus de type priorité basse, c'est a dire qu'il ne gene pas trop trop le reste des programmes qui serait amener a tourner en même temps.

- et aussi j'aimerais savoir si c'est possible de rendre un processus recursif, imaginons que l'utilisateur l'arrete grace a CTRL+ALT+SUPPR, j'aimerais que ce soit detecté et qu'il se relance de lui-même, un peu comme explorer.

merci et encore dsl de poser tant de question.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
4 janv. 2007 à 14:37
Salut,
Effectivement, dans ce genre de cas un thread est indispensable. Voici une page d'un chapitre sur les threads. Elle contient un lien vers un exemple complet:
http://bob.developpez.com/tutapiwin/article_50.php
Ton thread pourra ouvrir sa propre boite de dialogue et effecuer les recherches en permettant d'interrompre l'opération en cliquant sur un bouton de la boite mère.

Pour que le programme s'exécute au démarrage, tu as deux choix:
1- Ajouter le chemin de ton exe dans l'une des clés suivantes de la base de registres:
-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
-HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
2- Créer un service Windows.

Pour empêcher l'arrêt de ton programme, je pense qu'il faudra passer par un driver. Voici un code source permettant de cacher un processus:
CACHER-PROCESSUS-CHOIX-DRIVER
Tu peux soit utiliser le driver fourni avec le source ou le créer si tu as la DDK.
Une autre solution consiste à relancer le programme juste après sa fin en interceptant un message du système. La encore un driver est indispensable.
0
nerone21 Messages postés 108 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 5 mai 2011
4 janv. 2007 à 15:39
merci a toi rapcc, mais j'ai deja trouvé cette page et ca m'avance pas plus pakeu je sais pa du tout où demarrer mes threads, je saurai où les arreter mais pas exactement quand les demarrer...

a la limite ce que j'aimerais trouver c'est une source avec une boite de dialogue toute simple avec un bouton qui ouvre une autre boite de dialogue qui ferrait tourner une boucle infinie ou un truc du genre et un bouton arreter pour la stopper. avec ca je saurai m'adapter et je comprendrais le processus du truc...

merci pour le reste par contre et bonne continuation.
0
Rejoignez-nous