Seite 1 von 1

Thread wird nur einmal durchlaufen?

Verfasst: 13.05.2008 17:29
von KoopaOne
Ich habe eine Prozedur, die mir den Status in einer Webseite in einstellbaren Zeitabständen checkt, allerdings wird die Prozedur genau 1x aufgerufen, dann nicht mehr ...

Code: Alles auswählen

Procedure do_post(Stop)
  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,bytes_read.l,total_read.l
  
  result=""
  rs$="Überprüfe Status!"
  SetGadgetText(#str_Status,rs$)
  SetGadgetColor(#str_Status, #PB_Gadget_FrontColor, $000000)
  Debug "IM THREAD!"
   host.s = "xxx.xxx.com"
   get_url.s = "/index.html"
   result.s = ""
   open_handle = InternetOpen_("User Agent Info Goes Here",#INTERNET_OPEN_TYPE_DIRECT,"","",0)
   connect_handle = InternetConnect_(open_handle,host,#INTERNET_DEFAULT_HTTP_PORT,"","",#INTERNET_SERVICE_HTTP,0,0)
   request_handle = HttpOpenRequest_(connect_handle,"POST",get_url,"","",0,0,0)
   headers.s = "Content-Type: application/x-www-form-urlencoded" +Chr(13)+Chr(10)
   HttpAddRequestHeaders_(request_handle,headers,Len(headers), #HTTP_ADDREQ_FLAG_REPLACE | #HTTP_ADDREQ_FLAG_ADD)
   post_data.s = "Name=xxxx&Password=xxxx"
   post_data_len = Len(post_data)
   send_handle = HttpSendRequest_(request_handle,"",0,post_data,post_data_len)
   Buffer.s = Space(1024)
   bytes_read.l
   total_read.l
   total_read = 0
   
   Repeat
     InternetReadFile_(request_handle,@Buffer,1024,@bytes_read)
     result + Left(Buffer,bytes_read) + Chr(13)
     Buffer = Space(1024)
   Until bytes_read=0
   
   InternetCloseHandle_(open_handle)

Delay(stop)
EndProcedure
Also meine Frage: Warum wird der Thread nur 1x abgearbeitet?
EDIT: achja, aufrufen tue ich den thread mit thr_do_post=CreateThread(@do_post(),5000)
ausserhalb der hauptroutine...

Verfasst: 13.05.2008 17:40
von edel
Ein Thread laeuft nicht automatisch bis zum Ende des Programmes.
Du musst also dafuer sorgen das die Procedure selber weiterlaeuft.
Z.B. duch so :

Code: Alles auswählen


procedure thread(dummy)
 while #true
 ; function
 wend 
endprocedure 


Verfasst: 13.05.2008 17:42
von ts-soft
Der Thread wird so oft aufgerufen, wie Du aufrufe im Code hast :mrgreen:
Die Procedure enhält keine schleife mit Abbruchbedingung, läuft also einmal
durch und beendet sich.

Verfasst: 13.05.2008 18:44
von ZeHa
Hehe, genau den gleichen Fehler hab ich damals auch gemacht :mrgreen: und es schon auf PB geschoben... aber ich hatte halt auch null Ahnung von Threads, ich dachte auch das ist so ein Endlos-Ding im Hintergrund... :)

Verfasst: 13.05.2008 18:51
von Fluid Byte
Ist es nicht? Bild

Verfasst: 13.05.2008 20:58
von KoopaOne
aehem ich dachte auch, das ist ein Endlosding im Hintergrund, ist aber auch nirgends beschrieben ...

Wenn ich das also in die Hauptroutine packe ist's gut?
Das Delay ist als nur dazu gut, das der Code im Thread nicht die ganze Zeit neu aufgerufen wird .... d.h. er gibt Rechenzeit an die Hauptroutine ab?

Verfasst: 13.05.2008 22:44
von zigapeda
Wenn du das in die hauptroutine packst wird es denk ich mal öfter aufgerufen als dus haben willst und ein delay davor würde das ganze programm anhalten?
Warum baust du nicht einfach eine schleife in den thread ein oder eine abfrage ob der thread schon läuft und wenn er nicht läuft startest du ihn?

Verfasst: 13.05.2008 22:54
von ts-soft
Warum nicht einfach ein TimerCallback nutzen? Wofür sind den die netten
Timer in Windows :wink:

Erstens: kein Streß mit Thread
Zweitens: keine Krücke von Delay
Drittens: keine unnötige CPU-Last

Verfasst: 13.05.2008 23:11
von ZeHa
Naja, am einfachsten ist es, wenn man sich vorstellt, daß ein Thread wie eine Funktion ist, die man aufruft. Der Unterschied ist nur, daß sie irgendwann parallel im Hintergrund abgearbeitet wird, bis sie fertig ist, anstatt sofort und blockierend abzulaufen.

Daher muß man halt innen eine Endlosschleife benutzen, wenn man will, daß der Thread nicht endet - genau wie bei einer Funktion auch.