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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2010, 15:38   #1
sergeyrulit
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 53
По умолчанию [Потоки] Зависает на глухо.

Вообщем разбираюсь с потоками. Задача из Memo1 (5000 строк) все построчно скопировать в Memo2 и добавить на конце '_x'. В один поток это долго, хочу сделать 100 потоков.

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  Thread = class(TThread)
  private
    procedure Start;
  protected
    procedure Execute; override;
end;

var
  Form1: TForm1;
  Hread : array[1..100] of Thread;
  Hr : Integer;

implementation

procedure Thread.Start;
var
  i: integer;
begin
  for i:= 0 to Form1.Memo1.Lines.Count-1 do
    Form1.Memo2.Lines.Add(Form1.Memo1.Lines[i]+'_x');
end;

procedure Thread.Execute;
begin
  Synchronize(Start);
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  while Hr <= 100 do
  begin
    Hread[Hr]:=Thread.Create(false);
    Inc(Hr);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Hr:= 1;
end;

end.
Поправьте, подскажите. Спасибо.

Последний раз редактировалось sergeyrulit; 09.08.2010 в 15:53.
sergeyrulit вне форума Ответить с цитированием
Старый 09.08.2010, 15:44   #2
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Нельзя к компонентам формы обращаться из потока без Synchronize!!! И критические секции тут тебе не помощники. А как только сделаешь Synchronize - в потоке пропадет необходимость так как он ничего не будет делать, т.к. код, занесенный под Synchronize выполняется ОСНОВНЫМ потоком.
Ins вне форума Ответить с цитированием
Старый 09.08.2010, 15:51   #3
sergeyrulit
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 53
По умолчанию

Код в первом посте обновил, теперь вроде не виснет, но переносит из мемо1 в мемо2 все столько раз, сколько потоков. _ipicture.ru/uploads/100809/0kAFnT01m1.jpg

Цитата:
Нельзя к компонентам формы обращаться из потока без Synchronize!!! И критические секции тут тебе не помощники. А как только сделаешь Synchronize - в потоке пропадет необходимость так как он ничего не будет делать, т.к. код, занесенный под Synchronize выполняется ОСНОВНЫМ потоком.
Сделал Synchronize, хм, раз пропадает необходимость, как тогда сделать перенос в 100 потоков?
sergeyrulit вне форума Ответить с цитированием
Старый 09.08.2010, 15:59   #4
Ins
Форумчанин
 
Регистрация: 29.12.2007
Сообщений: 137
По умолчанию

Цитата:
Сделал Synchronize, хм, раз пропадает необходимость, как тогда сделать перенос в 100 потоков?
Непосредственно из потоков - никак, с GUI должен работать только один поток, остальные как правило нужны для фоновых вычислений или что-то в таком роде, но не обращению к форме. Следовательно если они что-то там считают, то пусть считают и заносят результат в какой-то список (невизуальный), например - TStringList, а главный поток уже пусть этот список выводит в Memo. Если они ничего не считают а просто должны работать с формой, то убирай их вообще, этого делать нельзя. Сэкономишь 100 Мб памяти А ты как думал - по мегабайту на стек потока система выделяет. Поэтому всегда, когда нужно более 3-4 потоков реализуют пул, а не 100 Thread-ов, которые у системы все ресурсы жрут
Ins вне форума Ответить с цитированием
Старый 09.08.2010, 22:20   #5
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Не занимайся ерундой))
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зависает цикл while fezilk24 Общие вопросы Delphi 13 12.06.2010 17:14
зависает компьютер руст Свободное общение 41 10.06.2010 07:46
Зависает программа DimOn4Ik Общие вопросы Delphi 4 29.05.2010 21:05
Функция зависает lobz1k Общие вопросы C/C++ 1 18.05.2010 05:05
Зависает комп Voda Компьютерное железо 3 27.08.2009 22:31