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 ?
Ptite question sur les threads : info externe
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
Ptite question sur les threads : info externe
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
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.