Autor Beitrag
NOS1971
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 193

Windows 8.1 PRO 64 Bit
Delphi XE7 Professional
BeitragVerfasst: Mo 04.08.14 19:35 
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:

ausblenden volle Höhe Delphi-Quelltext
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 variables and lists
     Reset;
     // item found
     URLAnalyserQuery.First;
     FCurrentURL := URLAnalyserQuery.FieldByName('URL').AsString;
     // check if we have the ressources to create another thread
     if MultiThreadedWebAnalyser.ProgressData.ActiveThreads < MultiThreadedWebAnalyser.MaxThreadPoolCount then
     begin
      // set the item to in progresss status
      URLAnalyserQuery.Edit;
      URLAnalyserQuery.FieldByName('STATUS').AsInteger := 0;
      URLAnalyserQuery.Post;
      URLAnalyserConnection.Commit;
      // update item data
      FCurrentItem := nil;
      FCurrentItem := MultiThreadedWebAnalyser.ResultURLDictionary.Items[FCurrentURL];
      if FCurrentItem <> nil then
      begin
       FCurrentItem.URLStatus := statusPending;
      end;
     end;
     // get data from field
     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;