Hallo zusammen ...
ich habe mir einen kleinen Spider geschrieben und möchte den nun multithreaded machen. hierzu habe ich mir die omnithreadlibrary installiert und mir einen AnalyseURLThread erzeugt. Dieser analysiert eine URL und gibt per PostMessage die gefundenen weiteren URL's weiter während diese dann in die Liste geadded werden noch während der Thread läuft. Das funktioniert schon super aber entweder ich beschäftige mich nun zu lange damit oder ich checks einfach nicht.
Folgendes Problem ergibt sich für mich:
ich gebe die erste URL / Domain vor und starte damit einen Thread zum analysieren ... ich kriege die Hauptschleife einfach nicht hin die mir aus der Liste die nächste URL holt und zum analysieren gibt.
Die Schleife läuft einmal durch und das wars. Zum Test added die analyse routine im moment jeweils eine url.
Hier mal der grobe Ablauf:
- initialisieren der analyse
- erste url/domain in die lsite adden
- thread starten
- while ... do schleife in der ich abfrage ob die liste abgearbeitet und keine threads mehr im threadpool laufen
Code:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| InitializeThreading; TempItem := lvTempSpiderResult.Items.Add; TempItem.Caption := cbURL.Text; lvTempSpiderResult.Items.EndUpdate; CurrentIndex := 0; NextItemIndex := GetNextAnalyseItem; if (NextItemIndex < lvTempSpiderResult.Items.Count) and (NextItemIndex <> -1) then begin CreateTask(TAnalyseURLThread.Create(Handle,lvTempSpiderResult.Items[NextItemIndex].caption,NextItemIndex)).MonitorWith(OmniTED).Schedule; inc(CurrentIndex); end; while (CurrentIndex <= lvTempSpiderResult.Items.Count - 1) and (GlobalOmniThreadPool.CountExecuting > 0) do begin while GlobalOmniThreadPool.CountExecuting >= MaxThreads do begin Application.ProcessMessages; end; if GlobalOmniThreadPool.CountExecuting < MaxThreads then begin NextItemIndex := GetNextAnalyseItem; if (NextItemIndex < lvTempSpiderResult.Items.Count) and (NextItemIndex <> -1) then begin CreateTask(TAnalyseURLThread.Create(Handle,lvTempSpiderResult.Items[NextItemIndex].caption,NextItemIndex)).MonitorWith(OmniTED).Schedule; inc(CurrentIndex); end; end; end; DeintializeThreading; if lvTempSpiderResult.Items.Count > 0 then lvTempSpiderResult.AutoSizeColumns; |
Ich hoffe ihr könnt mir ansatzweise helfen
Grüße,
Andreas