Page 1 sur 1

Ptite question sur les threads : info externe

Publié : ven. 22/juil./2005 22:37
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 ?

Publié : ven. 22/juil./2005 23:09
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

Publié : sam. 23/juil./2005 4:41
par nico
J'utiliserais une chaine globale pour copier la chaine du thread.