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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.07.2013, 06:13   #1
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
Вопрос Снова я и снова геморрой, только уже с многопоточностью

Вобщем потоки вроде и пашут но выдают один и тот же результат такое же количество раз сколько и запущено потоков, пробовал критические секции, только почему-то при запуске выдает ошибку (если их использовать), кнопки СТОП пока что нету (дабы небыло вопросов)... Не люблю потоки, и всегда у меня с ними проблемы, прошу помощи.

Кнопка СТАРТ:

Код:
Unit1

var
  Form1: TForm1;
  thr_potok:array [1..100] of th_potok;
  number:integer;

implementation

{$R *.dfm}

procedure TForm1.sButton5Click(Sender: TObject);
var
thread:integer;
begin
Form1.sButton5.Visible:=False;
Form1.sButton6.Visible:=True;
number:=-1; // это вроде и не обязательно
for thread:=1 to Form1.sSpinEdit1.Value-0 do
begin
thr_potok[thread]:=th_potok.Create(False); // тут пробовал менять на True, одно и то же...
thr_potok[thread].Priority:=tplower;
thr_potok[thread].FreeOnTerminate:=True;
thr_potok[thread].Resume;
end;
end;
Код:
Unit2

procedure th_potok.NextThread;
begin
inc(number);
end;

procedure th_potok.Execute;
var
// тут были переменные
i:integer;
s1, s2:TStringList;
begin
Form1.sButton5.Visible:=False;
Form1.sButton6.Visible:=True;
s1:=TStringList.Create;
s2:=TStringList.Create;
s1.LoadFromFile(Form1.sFilenameEdit1.FileName);
s2.LoadFromFile(Form1.sFilenameEdit2.FileName);
if not Terminated then
begin
Synchronize(NextThread);
//код
end;
end;
FleXik вне форума Ответить с цитированием
Старый 07.07.2013, 06:39   #2
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

Вот как делал это я:
Код:
TWorking=class(TThread)
id:integer;//уникальный id
  Private
   Protected 
      Procedure Execute; override;
  Public
    Constructor Create(CreateSuspended: boolean);
 destructor Destroy; override;
  end;
var
  job:integer=0;..счетчик заданий
  Thread:array [0..MAX_PATH] of TWorking;//кол во поток

implementation


{ TWorking }

constructor TWorking.Create(CreateSuspended: boolean);
begin
  inherited Create(CreateSuspended); 
  inc(job);//повышаем счетчик
end;

destructor TWorking.Destroy;
begin
  inherited;
end;
procedure TWorking.Execute;
begin
//code
end;
procedure createjob;
var
I:integer;
begin
I:=job;
Thread[i]:=Tworking.Create(true);
Thread[i].FreeOnTerminate:=true;
Thread[i].Priority:=tpnormal;
Thread[i].id:=i;
Thread[i].Resume;
end;
procedure term_Thread(Id:integer);
begin
if assigned(thread[id]) then thread[id].Terminate;//если поток под id жив останавливаем его
end;
Кольша вне форума Ответить с цитированием
Старый 07.07.2013, 06:41   #3
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Кольша, спс за кусок кода, сейчас попробую
FleXik вне форума Ответить с цитированием
Старый 07.07.2013, 06:56   #4
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

то же самое... сколько потоков указываю столько раз выдает один и тот же результат (если потоков 5 то вместо 1 раза выдает 5 раз одно и то же (мне кажется таки нужны критические секции в моем случае))

при использовании TRTLCriticalSection после нажатия кнопки "СТАРТ" выдает ошибку Access violation 77A4224D

Последний раз редактировалось FleXik; 07.07.2013 в 06:59.
FleXik вне форума Ответить с цитированием
Старый 07.07.2013, 07:31   #5
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

Ну дак надо указывать входные данные разные, или разбивать имеющиеся на части, сначала скажи, что ты хочешь получить от потоков, а потом уже посмотрим.
Кольша вне форума Ответить с цитированием
Старый 07.07.2013, 07:34   #6
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Кольша, что значит что я хочу получить от потоков?

пример как разбивать на части?
FleXik вне форума Ответить с цитированием
Старый 07.07.2013, 07:47   #7
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

Ну например тебе надо выполнить n действий, разбиваешь эти действие на X потоков
запускаещь цикл for i:=0 to round(n/x) do
create_job(i)ж
Кольша вне форума Ответить с цитированием
Старый 07.07.2013, 08:03   #8
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Кольша, понимаешь, там где у меня основной код (который я убрал в коде выше), там ничего сверхестественного и сложного нету (пару запросов + парсинг кое каких параметров из запросов), но почему-то в RichEdit выдает столько же одинаковых ответов сколько и потоков указано, бред какой-то, я уже всю ночь гуглю но ничего не получается(
FleXik вне форума Ответить с цитированием
Старый 07.07.2013, 08:11   #9
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

не пойму одного, почему создаются сразу все (к примеру) 5 потоков и они все берут одни и те же строки из .txt вместо того чтобы брать следующие... возможно в цикле у меня трабл?
FleXik вне форума Ответить с цитированием
Старый 07.07.2013, 08:28   #10
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

Дак епт, надо указывать потоком с какого место брать, про это я тебе и толкую.
Они берут txt с самого начала, и делают одно и тоже.
Кольша вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
И снова COM.... kineziz Общие вопросы C/C++ 6 22.07.2012 23:10
и снова капча! acteralex PHP 14 14.07.2012 20:31
Снова и снова. ladose Общие вопросы Delphi 1 11.04.2012 03:37
и снова С++ ltony Помощь студентам 5 04.02.2012 02:16
MDIChild снова и снова... Siber_Dec Общие вопросы Delphi 2 13.12.2009 03:24