Problem mit Threads und HTTPSendRequest_

Für allgemeine Fragen zur Programmierung mit PureBasic.
KoopaOne
Beiträge: 14
Registriert: 04.08.2006 14:30
Kontaktdaten:

Problem mit Threads und HTTPSendRequest_

Beitrag von KoopaOne »

Ich arbeite an einem multi-threaded Downloader. Die Dateien stehen in einem Linkedliste, die Download-Prozedur wird mit einer zweiten LinkedList als Pointer gefüttert.
Die Download-Prozedur selbst wird als Thread aufgerufen, wartet aber immer ob der vorhergegangene Thread fertig gestellt ist, das funktioniert soweit auch wunderbar.
Das Problem ist, dass der erste Durchlauf (die erste Datei) wunderbar heruntergeladen wird, ab der zweiten Datei steckt er allerdings in der Zeile mit dem HttpSendRequest_ stecken, ganz egal, welche Dateien ich ihn downloaden lasse. Selbst Dateien die als erste in der Liste wunderbar funktionieren, funktioniert als zweiter in der Liste nicht mehr.
Ich sitze seit 2 Tagen an diesem Problem und finde einfach keinen Grund ... Vielleicht könnt ihr mir helfen?

Code: Alles auswählen

Procedure.s download_file(*arg.dl)
  Protected host.s,get_url.s,result.s,open_handle,connect_handle,request_handle,headers.s
  Protected post_data.s,post_data_len,send_handle,Buffer.s,buffer2.s,bytes_read.l,total_read.l
  Protected linkstart, linkend, form1url$,rs_url$,durchlauf, save_file$,tmp$,arg$
  Protected firstslash,secondslash, hOutput,shouldhave, xPos,i,timer1,timer2,totaltimer,timerstart,timerend
  Protected Dim myarray.l(2),zaehler,cookie$,threadNumber,tmp.b
  Shared mutex
  LockMutex(Mutex)

  threadNumber=*arg\number ;Thread Number?
 
  arg$=*arg\url + "|" + *arg\referer + "|" + *arg\name ;Backwards-Compatibility to the old download-code
  Repeat
     SelectElement(PassedArguments(),threadnumber-1); Thread before is running?
     tmp=passedarguments()\finished
     Delay(1000)
     ;Debug "I am THREAD  " + Str(threadNumber) + " and Status of THREAD " + Str(threadNumber-1) + " is " + Str(tmp)
  Until tmp ; waits for the thread to finish
  Debug "Thread Number " + Str(threadNumber) + " startet ...." ;start the sequence
 
  arg$=*arg\url + "|" + *arg\referer + "|" + *arg\name ;Old Download-Code
  AddGadgetItem(#list_status,0,"Get File ...")

     tmp$=arg$
     arg$=ReplaceString(arg$,"view/","",1)
     ;Debug arg$
 ;--------------------------------------------------------------------------------------------------------------
 ; Get Referer, Cookies, etc.
 ;--------------------------------------------------------------------------------------------------------------
  Repeat
     xPos=FindString(arg$,"|",xPos+1)
     If xPos>0
          i=i+1
          myarray(i)=xPos
          ;Debug Str(i) + ". | : " + Str(myarray(i))
     EndIf
  Until xPos=0
 
  rs_url$=Left(arg$,myarray(1)-1)
  referer$=Mid(arg$,myarray(1)+1,myarray(2)-myarray(1)-1)
  save_file$=Right(arg$,Len(arg$)-myarray(2))
  ;Debug "URL: " + rs_url$
  ;Debug "REFERER: " + referer$
  ;Debug "SAVE: " + save_file$
  result=""
  firstslash=FindString(rs_url$,"/",8)
  host.s = Mid(rs_url$,8,firstslash-8)
  get_url.s = Right(rs_url$,Len(rs_url$)-firstslash+1)
  ;Debug "HOST: " + host.s
  ;Debug "URL : " + get_url.s
  result.s = ""


     ;hOutput=CreateFile(#PB_Any,save_file$)
     open_handle = InternetOpen_("Microsoft Internet Explorer 7.0",#INTERNET_OPEN_TYPE_DIRECT,"","",0)
     connect_handle = InternetConnect_(open_handle,host,#INTERNET_DEFAULT_HTTP_PORT,"","",#INTERNET_SERVICE_HTTP,0,0)
     headers.s=headers.s + "Cookie$
     HttpAddRequestHeaders_(request_handle,headers,Len(headers), #HTTP_ADDREQ_FLAG_REPLACE | #HTTP_ADDREQ_FLAG_ADD)
     request_handle = HttpOpenRequest_(connect_handle,"GET",get_url,"","",0,0,0)
     send_handle = HttpSendRequest_(request_handle,"",0,"",0)
     cookie$=getqueryInfo(request_handle,43)
     Debug "COOKIE : " + cookie$
     ;SetGadgetAttribute(#progressbar,#PB_ProgressBar_Maximum,shouldhave)

 ;--------------------------------------------------------------------------------------------------------------
 ; get the actual file ...
 ;--------------------------------------------------------------------------------------------------------------
  arg$=tmp$ 
  ;Debug "ARG: " + arg$
  i=0
  Repeat
     xPos=FindString(arg$,"|",xPos+1)
     If xPos>0
          i=i+1
          myarray(i)=xPos
          ;Debug Str(i) + ". | : " + Str(myarray(i))
     EndIf
  Until xPos=0
 
  rs_url$=Left(arg$,myarray(1)-1)
  referer$=Mid(arg$,myarray(1)+1,myarray(2)-myarray(1)-1)
  save_file$=Right(arg$,Len(arg$)-myarray(2))
  Debug "URL: " + rs_url$
  Debug "REFERER: " + referer$
  Debug "SAVE: " + save_file$
  result=""
  firstslash=FindString(rs_url$,"/",8)
  host.s = Mid(rs_url$,8,firstslash-8)
  get_url.s = Right(rs_url$,Len(rs_url$)-firstslash+1)
  Debug "HOST: " + host.s
  Debug "URL : " + get_url.s
  result.s = ""
     
     hOutput=CreateFile(threadnumber,save_file$)
     Debug "Datei-Handle: " + Str(hOutput)
     open_handle = InternetOpen_("Microsoft Internet Explorer 7.0",#INTERNET_OPEN_TYPE_DIRECT,"","",0)
     Debug "Open-Handle : " + Str(open_handle)
     connect_handle = InternetConnect_(open_handle,host,#INTERNET_DEFAULT_HTTP_PORT,"","",#INTERNET_SERVICE_HTTP,0,0)
     Debug "Conn-Handle : " + Str (connect_handle)
     headers.s=headers.s + "Cookie: " + cookie$
     headers.s=headers.s + Chr(13)+Chr(10)
     headers.s = headers.s + "Referer: " + referer$
     headers.s = headers.s + Chr(13)+Chr(10)
     Debug "Headers     : " + headers
     HttpAddRequestHeaders_(request_handle,headers,Len(headers), #HTTP_ADDREQ_FLAG_REPLACE | #HTTP_ADDREQ_FLAG_ADD)
     request_handle = HttpOpenRequest_(connect_handle,"GET",get_url,"","",0,0,0)
     Debug "REQ-Handle  : " + Str(request_handle)
     send_handle = HttpSendRequest_(request_handle,"",0,"",0) ;HIER BLEIBT ER AB DER ZWEITEN DATEI STECKEN!!!!
     Debug "SND-Handle  : " + Str(send_handle)
     shouldhave=Val(GetQueryInfo(request_handle, 5))
     Debug "SIZE: " + Str(shouldhave)
     SetGadgetAttribute(#progressbar,#PB_ProgressBar_Maximum,shouldhave)
 
 
  Buffer.s = Space(4096)
  total_read = 0
  totaltimer=0
  timerstart=ElapsedMilliseconds() 
  Debug "TIMER START: " + Str(timerstart)
  bytes_read=0

  Repeat
     InternetReadFile_(request_handle,@Buffer,4096,@bytes_read)
     WriteData(threadnumber,@Buffer,bytes_read)
     Buffer = Space(4096)
     timer1=ElapsedMilliseconds()-timerstart
     total_read=total_read+bytes_read
     ;If total_read>0:Debug "SPEED      : " + Str(total_read/timer1):EndIf
     If total_read>0 And timer1>0:SetGadgetText(#text_speed,Str(total_read/timer1) + " KB/sec"):EndIf
     Debug "BYZES: " + Str(total_read)
     SetGadgetState(#progressbar,total_read)
  Until bytes_read=0
 
     totaltimer=totaltimer+timer1
 
  If shouldhave=total_read Or total_read>shouldhave
     SelectElement(PassedArguments(),threadnumber)
     PassedArguments()\finished=#True
     Debug "ITEM " + Str(threadNumber) + " ist fertig!"
     ;MessageRequester("Download ok","Download succesfull finished!")
     msg_groesse=msg_groesse+total_read
     msg_dateien=msg_dateien+1
     msg_zeit=(ElapsedMilliseconds()-timerstart)/1000
     ;msg_speed=msg_groesse/msg_zeit     
     AddGadgetItem(#list_status,0,"------------------------------")
     AddGadgetItem(#list_status,0,"Ges. Grösse: " + Str(msg_groesse/1024) + "KB")
     AddGadgetItem(#list_status,0,"Ges. Dateien: " + Str(msg_dateien))
     AddGadgetItem(#list_status,0,"Ges. Zeit: " + Str(msg_zeit)+ " Sekunden")
     AddGadgetItem(#list_status,0,"------------------------------")
     InternetCloseHandle_(open_handle)
  EndIf
SetGadgetState(#progressbar,0)
anzahl_threads=anzahl_threads-1
CloseFile(threadNumber)
UnlockMutex(Mutex) 
cookie$=""
EndProcedure 
Ein weiteres Problem stellt sicher dar, das der Download in einem Thread abgearbeitet wird. Allerdings sehe ich (vielleicht bin ich auch bloss blind) keine andere Möglichkeit, den Download im Hintergrund laufen zu lassen und das Programm trotzdem reagieren zu lassen ...
Vielleicht hat ja jemand eine Idee?
| Win XP SP2 | PB 4.0 |