Threads et TimeOut

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Threads et TimeOut

Message par Oliv »

Salut, le problème a souvent été traité mais je n'arrive pas à trouver une solution "correcte" : J'ai un thread avec un "OpenNetworkConnection()" et je voudrais savoir si cette commande est toujours en cours au bout de 5 secondes, mais le problème est que l'échange de variables est dangereux et fait planter le programme et je n'arrive pas à utiliser les Mutex.
Merci :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

T'aurait un petit code! :)
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Oups j'ai fait un peu vite :D et du coup j'ai oublié la fin du message

Code : Tout sélectionner

Procedure FTP_Connect(Port.l)
  Thread.l = OpenNetworkConnection(FTP\Url,Port)
  If Thread
    FTP\ConnectionID = Thread
  Else
     FTP\ConnectionID = -1
  EndIf
EndProcedure
Et je voudrais trouver une façon de voir si OpenNetworkConnection() n'a toujours pas répondu au bout de 5 secondes.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

MLK a posté ça sur le forum Allemand

Code : Tout sélectionner

Procedure OpenNetworkConnectionEx(ServerName$, Port.l, TimeOut.l) 
  !Conn equ Esp+12 
  !Wsa  equ Esp+28 
  !Tout equ Esp+428 
  !Wait equ Esp+436 
  !Sock equ Esp+444 
  
  WsaData.WSADATA 
  Connection.SOCKADDR_IN 
  TimeOuts.TIMEVAL 
  WaitSock.ULARGE_INTEGER 
  Sock.l 
  
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
  !if ~ defined _gethostbyname@4 | defined @f 
  !extrn _gethostbyname@4 
  !@@: 
  !end if 
  ; 
  !if ~ defined _WSAStartup@8 | defined @f 
  !extrn _WSAStartup@8 
  !@@: 
  !end if 
  ; 
  !if ~ defined _socket@12 | defined @f 
  !extrn _socket@12 
  !@@: 
  !end if 
  ; 
  !if ~ defined _htons@4 | defined @f 
  !extrn _htons@4 
  !@@: 
  !end if 
  ; 
  !if ~ defined _ioctlsocket@12 | defined @f 
  !extrn _ioctlsocket@12 
  !@@: 
  !end if 
  ; 
  !if ~ defined _connect@12 | defined @f 
  !extrn _connect@12 
  !@@: 
  !end if 
  ; 
  !if ~ defined _select@20 | defined @f 
  !extrn _select@20 
  !@@: 
  !end if 
  ; 
  !if ~ defined _closesocket@4 | defined @f 
  !extrn _closesocket@4 
  !@@: 
  !end if 
  ; 
  !if ~ defined _WSACleanup@0 | defined @f 
  !extrn _WSACleanup@0 
  !@@: 
  !end if 
  
  ;;;;;;;;;;;;;;;;;; 
  !MOV    Eax, [Esp] 
  !OR     Eax, Eax 
  !JZ     @f 
  !PUSH   Eax 
  !CALL   _gethostbyname@4 
  !OR     Eax, Eax 
  !JZ     @f 
  !MOVSX  Ebx, word [Eax+8] 
  !CMP    Ebx, 2 
  !JNE    @f 
  !MOV    Ecx, [Eax+12] 
  !MOV    Ecx, [Ecx] 
  !MOV    Ecx, [Ecx]  
  !MOV    [Conn+4], Ecx  
  !LEA    Eax, [Wsa] 
  !PUSH   Eax 
  !PUSH   $0002 
  !CALL   _WSAStartup@8 
  !OR     Eax, Eax 
  !JNZ    @f  
  !CMP    byte [Wsa], 2 
  !JL     @f 
  !PUSH   6 
  !PUSH   1 
  !PUSH   2 
  !CALL   _socket@12 
  !CMP    Eax, -1 
  !JE     @f  
  !MOV    [Sock], Eax 
  !MOV    word [Conn], 2 
  !PUSH   dword [Esp+4] 
  !CALL   _htons@4 
  !MOV    word [Conn+2], ax 
  !MOV    Eax, dword [Esp+8] 
  !MOV    dword [Tout], Eax 
  !MOV    dword [Wait], 1 
  !MOV    Eax, dword [Sock] 
  !MOV    dword [Wait+4], Eax 
  !LEA    Eax, [Wait] 
  !PUSH   Eax 
  !PUSH   -2147195266 
  !PUSH   dword [Sock+8] 
  !CALL   _ioctlsocket@12 
  !PUSH   dword 16 
  !LEA    Eax, [Conn+4] 
  !PUSH   Eax 
  !PUSH   dword [Sock+8] 
  !CALL   _connect@12 
  !LEA    Eax, [Tout] 
  !PUSH   Eax 
  !PUSH   0 
  !LEA    Eax, [Wait+8] 
  !PUSH   Eax 
  !PUSH   0 
  !PUSH   0 
  !CALL   _select@20 
  !CMP    Eax, 0 
  !JNA    @f 
  !LEA    Eax, [Tout+4] 
  !PUSH   Eax 
  !PUSH   -2147195266 
  !PUSH   dword [Sock+8] 
  !CALL   _ioctlsocket@12 
  !CALL   _WSACleanup@0 
  !MOV    Eax, [Sock] 
  ProcedureReturn  
  !@@: 
  !CMP    dword [Sock], -1 
  !JNE    @f 
  !PUSH   dword [Sock] 
  !CALL   _closesocket@4  
  !@@: 
  !CMP    byte [Wsa], 0 
  !JE     @f 
  !CALL   _WSACleanup@0 
  !@@: 
  
  ;;;;;;;;;;;;; 
  !Restore Conn 
  !Restore Wsa 
  !Restore Tout 
  !Restore Wait 
  !Restore Sock 
EndProcedure 


InitNetwork() 

Host$ = "www.purearea.net" 

ServerID = OpenNetworkConnectionEx(Host$, 80, 1) 
If ServerID = 0 
  MessageRequester("", "Timeout") 
Else 
  If SendNetworkString(ServerID, "GET / HTTP/1.1" + #CRLF$ + "Host: " + Host$ + #CRLF$ + #CRLF$) 
    Response$   = Space($FFF) 
    ResponseLen = Len(Response$) 
    Repeat 
      inLen = ReceiveNetworkData(ServerID, @Response$ + Pos, ResponseLen - pos) 
      Pos + inLen 
    Until inLen = 0 Or Pos = ResponseLen 
    MessageRequester("", Response$) 
  EndIf 
  CloseNetworkConnection(ServerID) 
EndIf 
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Merci :D pour cette fonction ça peut m'être utile, mais comme c'est en ASM je ne compriend rien donc comment le refaire avec d'autres ? :oops:
Répondre