Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамические потоки(Thread) 
:(
    Опции темы
кмс
Дата 11.1.2014, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

Репутация: 1
Всего: 2



Здравствуйте.
Нужно создавать несколько потоков, количество которое заранее не известно.
В каждом потоке весь код идентичен, кроме входных параметров которые передаются при создании потока.
Я сделал так
Код

unit Tiris;

interface

uses
  ....

type
  TForm1 = class(TForm)
    procedure Button1Click(Sender: TObject);

type
  MThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure ThreadExit(Sender: TObject);
   ........................ // Остальные функции и процедуры
  public
    constructor Create(key_start: UInt64; key_end: UInt64); overload;

  var
    abc, def: UInt64;
    ks, ke: UInt64;
  end;

var
  Form1: TForm1;
  TThreadArray: array [1 .. 20] of TThread;

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j: Integer;
  uarr: array [1 .. 8, 1 .. 2] of UInt64;

begin
  for i := 1 to 4 do
  begin
    TThreadArray[i] := MThread.Create(uarr[i, 1], uarr[i, 2]);
  end;
end;

constructor MThread.Create(key_start, key_end: UInt64);
begin
  Create(True);
  FreeOnTerminate := True;
  OnTerminate := ThreadExit;
  Priority := tpNormal;
  Resume;
  ks := key_start;
  ke := key_end;
end;

procedure MThread.Execute;
begin
  inherited;

  for i2 := ks to ke do
  begin
  /////// тут переходы к функциям и процедурам которые ведут расчеты
 end;

end;

procedure MThread.A;
var
  tmp: UInt64;
begin

end;

procedure MThread.B;
var
  tmp: UInt64;
begin

end;

procedure MThread.C;
var
  tmp: UInt64;
begin

end;


Не знаю правильно ли сделал, но потоки вроде работают и все вычисления сохраняют как и положено каждый в свой файл.
Но вот результат вычислений не правильный smile
Мне кажется что проблема в переменных abc, def: UInt64; которые наверное одни и те же для всех потоков(а по ним как раз все и рассчитывается). А как их сделать для каждого потока отдельными не пойму smile


Это сообщение отредактировал(а) кмс - 11.1.2014, 17:05
PM MAIL   Вверх
кмс
Дата 11.1.2014, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

Репутация: 1
Всего: 2



Вообщет у меня в другом месте ошибка.
Создал в ручную несколько потоков, та же самая проблема, вычисления не верные.
Ошибку уже нашел, буду проверять.
PM MAIL   Вверх
Poseidon
Дата 11.1.2014, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(кмс @  11.1.2014,  17:01 Найти цитируемый пост)
Мне кажется что проблема в переменных abc, def: UInt64; которые наверное одни и те же для всех потоков
Все верно. Если хотите использовать глобальные переменные, но при этом нужно, что бы для каждого потока создавалась отдельная их копия, то объявляйте их не как var, а как threadvar. Но, мой совет, если эти переменные используются только в методах потока, то объявите их в private-секции класса MThread.

Добавлено через 1 минуту и 54 секунды
А стоп, не заметил. Попробуйте так:

Код

type
  MThread = class(TThread)
  private
    abc, def: UInt64;
    ks, ke: UInt64;
  protected
    procedure Execute; override;
    procedure ThreadExit(Sender: TObject);
   ........................ // Остальные функции и процедуры
  public
    constructor Create(key_start: UInt64; key_end: UInt64); overload;
  end;



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
кмс
Дата 12.1.2014, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 12.2.2009
Где: Казахстан

Репутация: 1
Всего: 2



Poseidon, спасибо. Теперь уже отлажу все на обычных потоках, потом буду пробовать с динамическими.


PM MAIL   Вверх
demibar
Дата 13.1.2014, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 20.1.2011

Репутация: нет
Всего: нет



По созданию служб на Delphi можно кое-что здесь посмотреть http://demiware.ru
PM MAIL   Вверх
boobie
Дата 13.1.2014, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



demibar, вот за такие ссылочки не в тему, да еще и одним сообщением за 3 года надо банить  smile 


Poseidon, так можно было использовать переменные в public-секции, тогда они были бы доступны из любго места, и у каждого потока - свои.
Т.е. записать вот так:
Код

public
    abc, def: UInt64;
    ks, ke: UInt64;
    constructor Create(key_start: UInt64; key_end: UInt64); overload;
  end;

Если я правильно понял задачу...
А у меня вопрос. Если разница между этой записью (выше) и этой:
Код

public
    var abc, def: UInt64;
    ks, ke: UInt64;
    constructor Create(key_start: UInt64; key_end: UInt64); overload;
  end;

когда добавляем var?

PM   Вверх
Poseidon
Дата 15.1.2014, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 9
Всего: 133



Цитата(boobie @  13.1.2014,  13:57 Найти цитируемый пост)
Poseidon, так можно было использовать переменные в public-секции
Есть в программировании хороший принцип: скрывай все что можно. Зачем выносить наружу переменные, которые снаружи никому не нужны?



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1894 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.