Einzelnen Beitrag anzeigen

Mayday171

Registriert seit: 19. Apr 2006
40 Beiträge
 
#1

dynamische Threads in while-Schleife

  Alt 7. Jun 2006, 07:10
Hallo,

Kann mir einer sagen wie ich Threads in einer while-Schleife erstelle? Lese nacheinander Dateien in einen Ordner aus und das Programm ist sehr langsam. Deswegen wollte ich es mal mit Threads probieren. Wie binde ich das ein und wie setze ich es um? HZab davon keine Ahnung...

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
    Rec:TSearchRec;
    m:integer;
    feld: array of string;
 begin
 setlength(feld,strtoint(getconfig('Dateien','Anzahl')));
//////////////////////////////////////////////////////////////////////////
///
/// FIND FILES FUNTION
///
//////////////////////////////////////////////////////////////////////////
   i:=0;

   while getconfig('checkboxen',inttostr(i))<>'errordo
    begin
    m:=0;
      if findfirst(getconfig('Allgemein','root')+getconfig('checkboxen',inttostr(i))+'\*.txt',faAnyFile,Rec)<>0 then
       begin
         i:=i+1;
         continue;
       end;
        // Übergabe der Namen
       if (StrCharCount(rec.name,'_')>strtoint(getconfig('Dateien','unique'))-1) and (pos('_',rec.Name)<>1) then
        begin
          listbox1.items.add(getconfig('checkboxen',inttostr(i))+'\'+rec.name);


          query.SQL.Text:='INSERT INTO '+getconfig('SQL','tabelle')+' (';
          query2.SQL.Text:='SELECT * FROM '+getconfig('SQL','tabelle')+' WHERE ';
          while m+1<=strtoint(getconfig('Dateien','Anzahl')) do
           begin
            delete(rec.Name,pos('.',rec.Name),4);
            if m+1=strtoint(getconfig('Dateien','Anzahl')) then
              feld[m]:=rec.Name
            else
             begin
               feld[m]:=cutrev(rec.Name,'_');
               rec.Name:=cut(rec.Name,'_');
             end;

             query.SQL.Text:=query.SQL.Text+cut(getconfig('Dateien','Feld'+inttostr(m+1)),':')+',';
             query2.SQL.Text:=query2.SQL.Text+cut(getconfig('Dateien','Feld'+inttostr(m+1)),':')+'=:'+cut(getconfig('Dateien','Feld'+inttostr(m+1)),':')+' AND ';
             query2.ParamByName(cut(getconfig('Dateien','Feld'+inttostr(m+1)),':')).Value:=feld[m];
             m:=m+1;

          end;
           query.SQL.Text:=query.SQL.Text+'zeit,ordner) VALUES (';

             m:=0;
             while m+1<=strtoint(getconfig('Dateien','Anzahl')) do
              begin
                query.SQL.Text:=query.SQL.Text+':'+cut(getconfig('Dateien','Feld'+inttostr(m+1)),':')+','; // PARAMETERNAMEN werden geschrieben
                query.ParamByName(cut(getconfig('Dateien','Feld'+inttostr(m+1)),':')).Value:=feld[m];
                m:=m+1;

              end;

              query.SQL.Text:=query.SQL.Text+':zeit,:ordner)';
              query2.SQL.Text:=query2.SQL.Text+'ordner=:ordner';
              query.ParamByName('zeit').AsSQLTimeStamp:=DateTimeToSqlTimeStamp(FileDateToDateTime(rec.Time));
              query.Parambyname('ordner').Value:=getconfig('checkboxen',inttostr(i));
              query2.ParamByName('ordner').Value:=getconfig('checkboxen',inttostr(i));
            //showmessage(query2.SQL.Text);

           query2.Open;

           //showmessage(inttostr(query2.RecordCount));
           if query2.RecordCount=0 then
            begin
              //showmessage('in Schleife');
              //query.ExecSQL;
              query.SQL.Clear;
            end;
            query2.Close;

        end;

////////////////////////////////////////////////////////////

      while findnext(rec)=0 do
        begin
           m:=0;
           /// Übergabe der Namen
          if (StrCharCount(rec.name,'_')>=strtoint(getconfig('Dateien','unique'))-1) and (pos('_',rec.Name)<>1) then
            begin
              listbox1.items.add(getconfig('checkboxen',inttostr(i))+'\'+rec.name);

            query.SQL.Text:='INSERT INTO '+getconfig('SQL','tabelle')+' (';
            query2.SQL.Text:='SELECT * FROM '+getconfig('SQL','tabelle')+' WHERE ';

            while m+1<=strtoint(getconfig('Dateien','Anzahl')) do //Schleife solange Anzahl in Ini
             begin
               delete(rec.Name,pos('.',rec.Name),4); /// löscht .txt
               if m+1=strtoint(getconfig('Dateien','Anzahl')) then // wenn Felder Anzahl das letzte (also der Name) dann kopieren
                 feld[m]:=rec.Name
               else
                begin
                  feld[m]:=cutrev(rec.Name,'_'); /// Dateinamen werden geschnitten und
                  rec.Name:=cut(rec.Name,'_'); /// Feld zugewiesen
                end;

               query.SQL.Text:=query.SQL.Text+cut(getconfig('Dateien','Feld'+inttostr(m+1)),':')+',';
               query2.SQL.Text:=query2.SQL.Text+cut(getconfig('Dateien','Feld'+inttostr(m+1)),':')+'=:'+cut(getconfig('Dateien','Feld'+inttostr(m+1)),':')+' AND ';
               query2.ParamByName(cut(getconfig('Dateien','Feld'+inttostr(m+1)),':')).Value:=feld[m];
               m:=m+1;

             end;
             query.SQL.Text:=query.SQL.Text+'zeit,ordner) VALUES (';

             m:=0;
             while m+1<=strtoint(getconfig('Dateien','Anzahl')) do
              begin
                query.SQL.Text:=query.SQL.Text+':'+cut(getconfig('Dateien','Feld'+inttostr(m+1)),':')+','; // PARAMETERNAMEN werden geschrieben
                query.ParamByName(cut(getconfig('Dateien','Feld'+inttostr(m+1)),':')).Value:=feld[m];
                m:=m+1;
              end;
              query.SQL.Text:=query.SQL.Text+':zeit,:ordner)';
              query2.SQL.Text:=query2.SQL.Text+'ordner=:ordner';
              query.ParamByName('zeit').AsSQLTimeStamp:=DateTimeToSqlTimeStamp(FileDateToDateTime(rec.Time));
              query.Parambyname('ordner').Value:=getconfig('checkboxen',inttostr(i));
              query2.ParamByName('ordner').Value:=getconfig('checkboxen',inttostr(i));

             //showmessage(query2.SQL.Text);

             query2.Open;
             //showmessage(inttostr(query2.RecordCount));
             if query2.RecordCount=0 then
              begin
                //showmessage('in Schleife');
                //query.ExecSQL;
                query.SQL.Clear;
              end;
              query2.Close;
           end;

          ////////////////////////

        end;
      i:=i+1;
      findclose(rec);
    end;

//////////////////////////////////////////////////////////////////////////
///
/// FIND FILES FUNTION ENDE
///
//////////////////////////////////////////////////////////////////////////
  Mit Zitat antworten Zitat