Ptite question sur les threads : info externe

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Ptite question sur les threads : info externe

Message par Progi1984 »

Voilà, j'ai un thread qui tourne pour aller chercher le contenu d'une page qu'il stocke dans une variable de type chaine, puis le thread s'arrete !

Je teste l'envoi de la string du thread vers une string pour mon prog mais el pb est comme le thread et le prog vont à des vitesses différentes, le thread n'a pas le temps de donner la variable avant que le thread ne se finisse !

j'espère bien m'etre expliqué !

Comment puis je régler ce probleme ?
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

J'espère que ce sera assez en phase avec ta question. En fait le + important ici, c'est le WaitThread() sans lequel (le test est facile à faire) le programme terminera avec un résultat vide.

Code : Tout sélectionner

Enumeration
  #File
EndEnumeration

#INTERNET_FLAG_RELOAD = $80000000
#INTERNET_DEFAULT_HTTP_PORT = 80
#INTERNET_SERVICE_HTTP = 3
#HTTP_QUERY_FLAG_NUMBER = $20000000
#HTTP_QUERY_CONTENT_LENGTH = 5
#HTTP_QUERY_STATUS_CODE = 19
#HTTP_STATUS_OK = 200
#INTERNET_OPEN_TYPE_DIRECT = 1

Global URL.s, String.s

Procedure CheckError(value, sMessage.s, terminate)
  If value = 0
      MessageRequester("Error : ", sMessage, #PB_MessageRequester_OK)
      If terminate
          End
      EndIf
  EndIf
EndProcedure

Procedure Internet_Download_to_String()
  FileName.s = "CacheFile.txt"
  If URLDownloadToFile_(#NULL, URL, FileName, #NULL, #NULL) <> 0
      Domain.s = RemoveString(Left(URL, FindString(URL, "/", 8) - 1), "http://")
      dwordSize = 4
      hInet = InternetOpen_("Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.7.8) Gecko/20050511 Firefox/1.0.4", #INTERNET_OPEN_TYPE_DIRECT, #NULL, #NULL, 0)
      CheckError(hInet, "Internet connection not available.", #TRUE)
      hURL = InternetOpenUrl_(hInet, URL, #NULL, 0, #INTERNET_FLAG_RELOAD, 0)
      CheckError(hURL, "InternetOpenUrl_() failed", #TRUE)
      hInetCon = InternetConnect_(hInet, Domain, #INTERNET_DEFAULT_HTTP_PORT, #NULL, #NULL, #INTERNET_SERVICE_HTTP, 0, 0)
      CheckError(hInetCon, "Unable to connect to " + Domain, #TRUE)
      hHttpOpenRequest = HttpOpenRequest_(hInetCon, "HEAD", RemoveString(URL, "http://" + Domain + "/"), "http/1.0", #NULL, 0, #INTERNET_FLAG_RELOAD, 0)
      CheckError(hHttpOpenRequest, "Http open request to " + Domain + " failed", #TRUE)
      CheckError(HttpSendRequest_(hHttpOpenRequest, #NULL, 0, 0, 0), "Http send request to " + Domain + " failed.", #TRUE)
      CheckError(HttpQueryInfo_(hHttpOpenRequest, #HTTP_QUERY_FLAG_NUMBER | #HTTP_QUERY_STATUS_CODE, @sCode, @dwordSize, @lpdwIndex), "Http query failed.", #FALSE)
      CheckError(sCode = #HTTP_STATUS_OK, "Status code query failed.", #FALSE)
      CheckError(HttpQueryInfo_(hHttpOpenRequest, #HTTP_QUERY_FLAG_NUMBER | #HTTP_QUERY_CONTENT_LENGTH, @sCode, @dwordSize, @lpdwIndex), "CONTENT_LENGTH query failed.", #FALSE)
      If sCode
          DataBufferLength = sCode
        Else
          DataBufferLength = 4096
      EndIf
      *DataBuffer = AllocateMemory(DataBufferLength)
      CheckError(*DataBuffer, "Not enough memory.", #TRUE)
      CheckError(CreateFile(0, FileName), "Unable to create file.", #TRUE)
      Repeat
        CheckError(InternetReadFile_(hURL, *DataBuffer, DataBufferLength, @Bytes), "Download failed.", #TRUE)
        If Bytes
            WriteData(*DataBuffer, Bytes)
        EndIf
      Until Bytes=0
      CloseFile(0)
      FreeMemory(*DataBuffer)
      InternetCloseHandle_(hInetCon)
      InternetCloseHandle_(hURL)
      InternetCloseHandle_(hInet)
  EndIf
  If ReadFile(#File, FileName)
      *Buffer = AllocateMemory(Lof())
      ReadData(*Buffer, Lof())
      CloseFile(#File)
      DeleteFile(FileName)
  EndIf
  String = PeekS(*Buffer)
  FreeMemory(*Buffer)
  ProcedureReturn String
EndProcedure

;
;
;  
  URL = "http://www.purebasic.com"
  ThreadID = CreateThread(@Internet_Download_to_String(), 0)
  WaitThread(ThreadID)
  MessageRequester("Result", String, #PB_MessageRequester_OK)
End
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

J'utiliserais une chaine globale pour copier la chaine du thread.
Répondre