Thread wird nur einmal durchlaufen?

Anfängerfragen zum Programmieren mit PureBasic.
KoopaOne
Beiträge: 14
Registriert: 04.08.2006 14:30
Kontaktdaten:

Thread wird nur einmal durchlaufen?

Beitrag 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...
| Win XP SP2 | PB 4.0 |
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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 

Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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... :)
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Ist es nicht? Bild
Windows 10 Pro, 64-Bit / Outtakes | Derek
KoopaOne
Beiträge: 14
Registriert: 04.08.2006 14:30
Kontaktdaten:

Beitrag 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?
| Win XP SP2 | PB 4.0 |
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag 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?
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Antworten