Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2015, 02:59   #1
Vlad2891
Пользователь
 
Регистрация: 22.02.2015
Сообщений: 24
По умолчанию Потоки в цикле

Доброго времени суток! Подскажите пожалуйста как привязать потоки к данному коду. Пытаюсь разобраться но ничего не получается, просто цикл повторяется n-ое кол-во раз, а нужно чтобы он их делал последовательно. Суть программы в том, чтобы она брала из 1 файла список строк и проверяла строки на совпадение с 2ым файлом. Если строка из первого файла не встречается во втором то вывести на листбокс.
Без потоков большие объемы проверяет очень долго, например когда по 100 000 строк в первом и втором файле. Помогите разобраться! Буду очень признателен
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    ListBox1: TListBox;
    OpenDialog1: TOpenDialog;
    ListBox2: TListBox;
    Button2: TButton;
    ListBox3: TListBox;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

potok = class(TThread)
    private
    { Private declarations }
  protected
    procedure Execute; override;
    public
    procedure check;
    constructor Create(CreateSuspended: Boolean);
  end;

var
  Form1: TForm1;
  f:text;
  base,s,s1,s2:string;
  kl1,kl2:integer;
  a:array [1..100] of potok;
implementation
constructor potok.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);     //çàãðóçêà áàçû
begin
Label14.Caption:='Çàãðóæàåì áàçó...';
ListBox2.Items.LoadFromFile('Text2.txt');
If OpenDialog1.Execute then begin
base:=OpenDialog1.FileName;
ListBox1.Items.LoadFromFile(base);
kl1:=ListBox1.Count;
kl2:=ListBox2.Count;
Label2.Caption:=IntToStr(kl1);
Label12.Caption:=IntToStr(kl2);
end;
OpenDialog1.Free;
Label14.Caption:='Îòäûõ';
if ListBox1.Count>0 then
Button1.Enabled:=False;
end;


procedure potok.Execute;
var
i,j,c:integer;
begin
for i:=1 to kl1 do begin
c:=0;
s1:=Form1.ListBox1.Items[i-1];
For j:=1 to kl2 do begin
s2:=Form1.ListBox2.Items[j-1];
if s1=s2 then c:=1;
end;
if c=0 then Synchronize(check);
end;
end;


procedure potok.check;
begin
Form1.ListBox3.Items.Add(s1);
end;


procedure TForm1.Button2Click(Sender: TObject);
var
pot:integer;
begin
for pot:=1 to 5 do
a[pot]:=potok.Create(false);
end;

end.
Vlad2891 вне форума Ответить с цитированием
Старый 22.02.2015, 03:12   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,881
По умолчанию

Цитата:
Без потоков большие объемы проверяет очень долго
С потоками тоже будет проверять долго. Потоки - не волшебная палочка делающая суперкомпьютер из обычного десктопа.
northener вне форума Ответить с цитированием
Старый 22.02.2015, 08:25   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
procedure potok.Execute;
var i,j,c:integer; st1,st2:TStringList;
begin
 st1:=TStringList.Create; st1.LoadFromFile(base);
 st2:=TStringList.Create; st2.LoadFromFile('Text2.txt');
 s1:='';
 for i:=0 to st1.count-1 do   if st2.IndexOf(st1[i]) then begin s1:=s1+st1[i]+#13#10; 
 st1.free; st2.free;
 Synchronize(check);
end;
А работу с ListBox из потоков убери напрочь. И файл в него не загружай.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.02.2015, 12:36   #4
Vlad2891
Пользователь
 
Регистрация: 22.02.2015
Сообщений: 24
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
С потоками тоже будет проверять долго. Потоки - не волшебная палочка делающая суперкомпьютер из обычного десктопа.
Тогда как сделать чтобы проверял быстрее?
Мне приходит в голову только разделить первый файл поровну на n частей и для каждой написать поток с синхронизированным выводом на Листбокс

Цитата:
Сообщение от Stilet Посмотреть сообщение
Код:
 for i:=0 to st1.count-1 do   if st2.IndexOf(st1[i]) then begin
А работу с ListBox из потоков убери напрочь. И файл в него не загружай.
Ругается "Type of expression must be BOOLEAN"

Последний раз редактировалось Stilet; 22.02.2015 в 15:00.
Vlad2891 вне форума Ответить с цитированием
Старый 22.02.2015, 13:24   #5
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

Цитата:
Ругается "Type of expression must be BOOLEAN"
рано вам еще потоки
lomastr_ вне форума Ответить с цитированием
Старый 22.02.2015, 15:02   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Ругается "Type of expression must be BOOLEAN"
Да? А на лентяя, который не хочет ничему учиться не ругается?
А я то думал что ты сейчас начнешь в хелпе искать описания всего этого, но видимо ранг тот же.
Код:
if st2.IndexOf(st1[i])<>-1
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.02.2015, 17:28   #7
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Сори плиз. Но вы же знаете мою неуёмную тягу решать задачки аля лабораторные по delphi.
Сравнение 2х файлов.zip
Так я и не научился нормально потоки останавливать. Всё какие-то костыли приделывать приходится.

2 Vlad2891
Много потоков не делай. Вот у меня i5 - 4 ядра. Так вот: 2 потока - 50% загрузки ядра, 3 потока - 75%. Намек ты понял.

Второе (тут я уже помогать не стану, реально - не интересно). Перед тем как сравнивать 2 больших объема данных, поработай над ними.

Например, если отсортировать списки по длине строк:

Список 1:
22
222
333
444
4444
7777777

Список 2:
1
22
333
4444
55555
666666
7777777

Вот дошел ты, скажем, до строки "222" в списке 1 и "4444" в списке 2. Всё. Дальше идти смысла нет. Можно вообще разбить списки 1 и 2 на подсписки со строками одной длины и сравнивать только списки со строками одной длины.

Ну и третье
Порой структура самих данных подскажет тебе, как оптимальнее сравнивать. Если строки не рэндомные, как у меня, а имеют смысл и закономерности построения, то этим грех не воспользоваться.

P/S: Ну и скажет мне кто, как правильно убить поток и дождаться его полной кончины. А то так и будут моим кодом программисты своих детишек, как бабайкой, пугать. Или ничё? Сойдет для личного пользования.

Последний раз редактировалось Sibedir; 22.02.2015 в 17:30.
Sibedir вне форума Ответить с цитированием
Старый 22.02.2015, 17:34   #8
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

FreeAndNil?
ДралсяСошибками вне форума Ответить с цитированием
Старый 22.02.2015, 17:51   #9
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Сообщение от ДралсяСошибками Посмотреть сообщение
FreeAndNil?
Не-а. Ругается. И правильно делает.
Добавил
Код:
  T1 := TPotok.Create (P1);
и при закрытии формы
Код:
  FreeAndNil (T1);
Матов стока!!! Половину я понял. Половину - нет. Ясно одно. Поток живее всех живых.
Sibedir вне форума Ответить с цитированием
Старый 22.02.2015, 18:02   #10
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

Посмотрел ваш код, там стоит FreeOnTerminate := True; значит достаточно Terminaate;
Ежелиб стояло False, то самому крошить поток методом Free;
ДралсяСошибками вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки. Закрываются все потоки при ошибке в одном. Son Общие вопросы Delphi 11 01.11.2013 09:32
потоки в цикле MasterSporta Общие вопросы C/C++ 2 01.10.2011 17:07
Цикл в цикле... Davlet M Помощь студентам 6 25.01.2010 01:42
Ошибка в цикле Alamez Общие вопросы Delphi 2 05.04.2009 15:12