problem with multithreading in string sorting is not correct sorting
// создание потоков procedure TForm1.StartClick(Sender: TObject); var i: integer; begin chez := 0; chez2 := 0; c := -1; working := True; SetLength(thread_mass, Form1.SpinEdit.Value); for i := 0 to Form1.SpinEdit.Value -1 do begin thread_mass[i] := Potok.Create(True); thread_mass[i].Priority := tpNormal; thread_mass[i].FreeOnTerminate := True; thread_mass[i].Resume; end; end; // главный поток procedure Potok.Execute; begin while working do //работаем пока переменная равна тру begin try CS.Enter; //вход в критическую секцию Inc(c); // переменная глобальная накручивается чтоб посчитать количество потоков if c < Filez.Count then //условие условие сравнивает количество потоков и количество строк в глобальном объекте Filez potz := c // записываем данные с глобальной переменной в переменную которую я создал в классе самого потока else working := False; // если условие не выполнено то выходим из цикла finally // заставляем потоки покинуть секцию CS.Leave; // выход из критической секции end; if working then // проверяем цикл закончился или нет begin if pos('vasy',LowerCase(Filez.Strings[potz]))<> 0 then // проверка имени в строке begin rez := 1; Sleep(3); end else if pos('misha',LowerCase(Filez.Strings[potz]))<>0 then // проверка имени в строке begin rez := 1; Sleep(3); end else if pos('petia',LowerCase(Filez.Strings[potz]))<>0 then // проверка имени в строке begin rez := 1; Sleep(3); end else if pos('lexa',LowerCase(Filez.Strings[potz]))<>0 then // проверка имени в строке begin rez := 1; Sleep(3); end else // любые другие имена begin rez := 2; Sleep(3); end; Synchronize(Synhz); // синхонизируем данные end; end; end; //дальше синхронизация так как будем работать c vcl и ее глобальными переменными,объектами изменять их procedure Potok.Synhz; begin case rez of 1:begin inc(chez); // это счетчик глобальной переменной что вывести данные в лейбл rus_D.Add(Filez.Strings[potz]); // дабавление имен в глобальный объект с индексом переменной класса самого потока Form1.Label4.Caption := IntToStr(chez); // вывод самого счетчика end; 2:begin inc(chez2); //это другой счетчик глобальной переменной что вывести данные лейбл ether_D.Add(Filez.Strings[potz]); // дабавление имен в глобальный объект с индексом переменной класса самого потока Form1.Label12.Caption := IntToStr(chez2); // вывод самого счетчика end; end; end; actually, what is the mistake when sorting names and adding Russian names to the rus_D object, there are English ones that should fall into
object ether_D, as I understand it, it’s connected that I didn’t secure the streams, but I don’t see what error I’d be very grateful for the clarification of
what am i doing wrong and how to
Update
var // глобально объявлена CS: TCriticalSection; // инициализируется при создании формы procedure TForm1.FormCreate(Sender: TObject); begin CS := TCriticalSection.Create; end; type Potok = class(TThread) private { Private declarations } protected procedure Execute; override; procedure Synhz; public potz: Integer; //вот здесь объявлен { Public declarations } end;
FilezlistFilezafter starting threads? - Anton Shchyrovpotzannounced? - Anton Shchyrov