Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Evitar que se congele mi aplicación!! (https://www.clubdelphi.com/foros/showthread.php?t=29413)

acertij022 20-01-2006 21:24:45

Evitar que se congele mi aplicación!!
 
Hola Forista necesitaria si me pueden ayudar para solucionar el siguiente problema:
Estoy utilizando API para conectarme a una pagina (wininet) la duda es la siguiente cuando ago una llamada como ser InternetOpenUrl esta me paraliza la aplicacion hasta que llegue la respuesta hay alguna forma de refrescar mi aplicacion durante este proceso ya probee con application.ProcessMessages pero no funciona ya que lo coloco en la siguiente linea que hago la peticion.

Desde ya muchas gracias:rolleyes:

jmariano 20-01-2006 22:35:32

La verdad es que no he trabajado con esta API aún, pero, según encontré por ahí, el truco está en hacer la llamada a "InternetOpen" (la primera función que ha de invocarse y que inicializa el API WinInet) pasándole como parámetro (o "flags"): INTERNET_FLAG_ASYNC. De esta manera, todas las llamadas a las demás funciones, como "InternetOpenUrl", se ejecutarán de forma asíncrona, es decir, devolverá el control a la aplicación antes de que se termine su ejecución.

Saludos!

acertij022 20-01-2006 23:21:16

Tenes razon pero pierdo el control mi codigo es :
Código Delphi [-]
    hInet := InternetOpen(PChar(application.title),INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY,nil,nil,INTERNE  T_FLAG_ASYNC);
    hConnect := InternetOpenUrl(hInet,PChar(HTTPserver),nil,0,0,0);


    if not Assigned(hConnect) then....//hConnet = nil

Todo esto porque necesito saber el contenido de la cabecera de una conexion TCP con protocolo HTTP para saber la IP y identificar si esta conectado a un proxy anonimo o no.

jmariano 20-01-2006 23:45:14

Como ya te comenté no estoy muy familiarizado con esta API, pero, según leí en el MSDN de Microsoft, cuando se hacen llamadas asíncronas hay que crear una función "callback" de estado que sirve, precisamente, para monitorear el estado de una "petición" de Internet (y es, en esta función, donde creo que tendría que ir tu código de verificación).

Visita la siguiente dirección que te muestra como ha de crearse y usarse tal función:
http://windowssdk.msdn.microsoft.com..._functions.asp

Espero que te sirva!

Saludos!

roman 21-01-2006 00:02:17

De lo mejor que he visto en español para usar WinInet:

http://www.lawebdejm.com/prog/delphi/index.html

// Saludos

acertij022 23-01-2006 22:19:47

Gracias a todos con la info que me dieron me funciono, era como me habian dicho ustedes:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
hSession, hURL: HInternet;
lpBuffer: array[0..1024+1] of Char; 
dwBytesRead: DWORD;
begin
hSession := InternetOpen(PChar(ExtractFileName(Application.ExeName)),INTERNET_OPEN_TYPE_PRECONFIG,nil, nil, 0);
if Assigned( hSession ) then 
  begin
  hURL := InternetOpenUrl( hSession, PChar('http://www.xxxxxxxx.com.ar/ip.php'), nil, 0, 0, INTERNET_FLAG_ASYNC);
  if Assigned( hURL ) then
     while true do
          begin
          dwBytesRead := 1024;
          InternetReadFile( hURL, @lpBuffer, 1024, dwBytesRead );
          if dwBytesRead = 0 then break;
          lpBuffer[dwBytesRead] := #0;
          Memo1.Lines.Add( lpBuffer );
          end; //while
InternetCloseHandle( hURL );
end;
InternetCloseHandle( hSession );
end;
:p


La franja horaria es GMT +2. Ahora son las 10:33:36.

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