Hallo zusammen,
mal wieder habe ich ein Multithreadingproblem bei dem ich nicht wirklich weiter komme
ich habe mehrere threads die sich aus einer table ihre datensätze zum arbeiten holen
also starte ich 10 threads und gebe einen datensatz in die db ...
der workerthread ist so aufgebaut das er sich einen datensatz holt dessen statusflag auf -1 steht ... nachdem er einen datensatz gefunden hat setze ich sofort das statusflag auf 0 und update die tabelle .... trotz allem holen sich noch mehrere threads diesen gleichen datensatz ... was ist zu tun ? was ist falsch ?
hier mal der teil wo der datensatz geholt wird:
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:
| URLAnalyserQuery.Close; URLAnalyserQuery.Open('SELECT * FROM AnalyseResultURLTable WHERE STATUS = "-1";'); if not URLAnalyserQuery.IsEmpty then begin Reset; URLAnalyserQuery.First; FCurrentURL := URLAnalyserQuery.FieldByName('URL').AsString; if MultiThreadedWebAnalyser.ProgressData.ActiveThreads < MultiThreadedWebAnalyser.MaxThreadPoolCount then begin URLAnalyserQuery.Edit; URLAnalyserQuery.FieldByName('STATUS').AsInteger := 0; URLAnalyserQuery.Post; URLAnalyserConnection.Commit; FCurrentItem := nil; FCurrentItem := MultiThreadedWebAnalyser.ResultURLDictionary.Items[FCurrentURL]; if FCurrentItem <> nil then begin FCurrentItem.URLStatus := statusPending; end; end; FUpperCaseCurrentURL := Uppercase(FCurrentURL); FCurrentItemID := URLAnalyserQuery.FieldByName('ID').AsInteger; FCurrentInternalLinks := 0; FCurrentExternalLinks := 0; FCurrentReferringLinks := 0; FCurrentContentLength := -1; FCurrentSiteSize := -1; FCurrentRobotsTag := ''; FCurrentRetryCount := URLAnalyserQuery.FieldByName('RETRYCOUNT').AsInteger; FCurrentRootURL := URLAnalyserQuery.FieldByName('ROOTURL').AsString; FCurrentURLLocation := URLAnalyserQuery.FieldByName('LOCATION').AsInteger; FCurrentHTTPStatus := URLAnalyserQuery.FieldByName('HTTPSTATUS').AsInteger; FCurrentServer := URLAnalyserQuery.FieldByName('SERVER').AsString; FCurrentMimeType := URLAnalyserQuery.FieldByName('MIMETYPE').AsString; FCurrentCharset := URLAnalyserQuery.FieldByName('CHARSET').AsString; FCurrentRequestDateTime := URLAnalyserQuery.FieldByName('REQUESTDATETIME').AsString; FCurrentFeed := URLAnalyserQuery.FieldByName('FEED').AsInteger; end; URLAnalyserQuery.Close; |