Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Porque WaitForMultipleObjects bloquea mi aplicacion y otras funciones? (https://www.clubdelphi.com/foros/showthread.php?t=45440)

JuanErasmo 03-07-2007 16:24:32

Porque WaitForMultipleObjects bloquea mi aplicacion y otras funciones?
 
hola amigos, estoy intentando monitorear el cambio de una carpeta , es decir, que me genere un evento al crear una carpeta nueva....ya tengo la funcion, el problema es que me bloquea la aplicacion misma, y algunas otras funciones de windows.....
el codigo es este,,,
Código:

HANDLE  dwChangeHandles[2];
      dwChangeHandles[0]  =  FindFirstChangeNotification(
          "C:\\contar",
          FALSE,
          FILE_NOTIFY_CHANGE_FILE_NAME);
      if  (dwChangeHandles[0]  ==  INVALID_HANDLE_VALUE)
          ExitProcess(GetLastError());
      dwChangeHandles[1]  =  FindFirstChangeNotification(
          "C:\\contar",
          TRUE,
          FILE_NOTIFY_CHANGE_DIR_NAME);
      if(dwChangeHandles[1]  ==  INVALID_HANDLE_VALUE)
          ExitProcess(GetLastError());
      while  (TRUE)
      {
          if(WaitForMultipleObjects(2,  dwChangeHandles,
                  FALSE,  INFINITE)!=WAIT_OBJECT_0)break;
          ShowMessage("Cambio!  ");
          if(FindNextChangeNotification(dwChangeHandles[0])  ==  FALSE)//????
                  break;
          if  (FindNextChangeNotification(dwChangeHandles[1])  ==  FALSE)
                  break;
      }
      Memo1->Lines->Add(WaitForMultipleObjects(2,  dwChangeHandles,
                  FALSE,  INFINITE)) ;
      ShowMessage("end");      // Muestra esto cuando se crea o se elimina una carpeta.

Que puedo hacer para que funcione "normalmente" ?
Gracias

jachguate 08-12-2009 23:50:50

Me temo que llego muy tarde con mi respuesta, pero la publico por si pudiera servir a alguien mas, y por que no, a vos si no lo has resuelto, ya que ahora, investigando un poco sobre "espiar" un directorio, llegué a este hilo.

La naturaleza de las llamadas a funciones Wait* del API... es esa, esperar (de allí su nombre)

Si pretendes tener una aplicación que trabaje "normal", mientras espera, lo que podes hacer es invocar a la función wait en un hilo secundario, y que este notifique al hilo principal cuando el objeto (u objetos) que estas "esperando" son señalados.

Encontré un componente que hace precisamente esto sobre un directorio. No lo he probado, pero viendo el código, parece que funcionará, así que te dejo una liga para que podas probarlo por vos mismo.

http://www.angusj.com/delphi/dirwatch.html

Un saludo ;)

Lepe 09-12-2009 08:53:28

Al menos en Delphi 7\Demos\Shellcontrols tienes el componente TShellChangeNotifier que parece hace eso mismo, sólo es cuestión de instalar el componente que aparece en dicha carpeta, (no lo he probado)


La franja horaria es GMT +2. Ahora son las 09:18:55.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi