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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2010, 12:17   #1
amaroktmb
 
Аватар для amaroktmb
 
Регистрация: 03.01.2010
Сообщений: 9
По умолчанию thread вешает приложение

Заранее извиняюсь, но этот вопрос упоминался в другой моей теме в разделе сетей. Просто там этот вопрос не в тему поэтому решил повтрить его тут.

у меня проблема такого рода: при создании потока он вешает приложение. загрузка цп 100%. в чем может быть проблема. читал много инфы по потокам но ничего не нашел.
вот пример кода

Код:
unit Unit3;

interface

uses
  Classes, sysutils;

type
  mythread = class(TThread)
    name:string;
    i:longint;
    procedure showmsg1;//(i:longint);
    procedure showmsg2;//(i:longint);
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

implementation

uses unit1;
{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure mythread.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ mythread }

procedure mythread.showmsg1;//(i:longint);
begin
form1.Memo1.Lines.Append(inttostr(i));
end;

procedure mythread.showmsg2;//(i:longint);
begin
form1.Memo2.Lines.Append(inttostr(i));
end;

procedure mythread.Execute;
  { Place thread code here }
begin
while not terminated do begin
  inc (i);
  if name='1' then Synchronize(showmsg1);
  if name='2' then Synchronize(showmsg2);
  if i>10000 then terminate;
    end;
end;

end.
а также часть кода из модуля Unit1

Код:
t1:=mythread.Create(false);
t1.name:='1';
t2:=mythread.Create(false);
t2.name:='2';
//Application.ProcessMessages;

Последний раз редактировалось amaroktmb; 07.01.2010 в 12:18. Причина: цытаты
amaroktmb вне форума Ответить с цитированием
Старый 07.01.2010, 15:33   #2
betirsolt
Форумчанин
 
Регистрация: 20.07.2009
Сообщений: 421
По умолчанию

а приоритет какой ставишь потоку?попробуй potok.Priority:=tplower;
Уважаемые модераторы, Я всячески стараюсь не нарушать правила сайта, будьте снисходительны
betirsolt вне форума Ответить с цитированием
Старый 07.01.2010, 15:37   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а собственно когда зависает то?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.01.2010, 17:15   #4
amaroktmb
 
Аватар для amaroktmb
 
Регистрация: 03.01.2010
Сообщений: 9
По умолчанию

Цитата:
Сообщение от betirsolt Посмотреть сообщение
а приоритет какой ставишь потоку?попробуй potok.Priority:=tplower;
ничего не меняется от приоритетов. вот сами попробуйте создать новый поток с пустым циклом while not terminated и увидите . а чтобы увидеть надо открыть диспетчер задач и посмотреть загруженность ЦП
amaroktmb вне форума Ответить с цитированием
Старый 07.01.2010, 17:31   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

причина в методах синхронизации.

вы просто практически вклиниваетесь в основной поток.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.01.2010, 18:14   #6
amaroktmb
 
Аватар для amaroktmb
 
Регистрация: 03.01.2010
Сообщений: 9
По умолчанию

спасибо всем кто пытался оказать помощь решение проблемы я нашел методом проб и какой-то матери необходимо просто добавить sleep(1) в тело процедуры execute. тогда у основного потока будет необходимое ему время.

Код:
while not terminated do begin
  sleep(1);
  inc (i);
  if name='1' then Synchronize(showmsg1);
  if name='2' then Synchronize(showmsg2);
  if i>5000 then terminate;
  end;
протестировал основательно. пробовал создавать 101 такой поток и приложение не грузит процессор практически вообще
amaroktmb вне форума Ответить с цитированием
Старый 07.01.2010, 18:31   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

А Application.ProcessMessages не захотелось попробовать?
Вместо Sleep().
mihali4 вне форума Ответить с цитированием
Старый 07.01.2010, 20:43   #8
amaroktmb
 
Аватар для amaroktmb
 
Регистрация: 03.01.2010
Сообщений: 9
По умолчанию

у меня класс потока описан в другом модуле. поэтому проще слипом
amaroktmb вне форума Ответить с цитированием
Старый 12.01.2010, 19:49   #9
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

а почему все-таки висело? Просто быстро отработал и убился.
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Старый 12.01.2010, 23:06   #10
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Как уже было сказано выше, прорамма подвисала из-за синхронизации потоков. Код, выполняемый через Synchronize, выполняется в главном потоке приложения, временно приостанавливая все остальные потоки. Беспрерывный вызов Synchronize не оставлял главному потоку времени на обработку оконных сообщений, чем и вызывал зависание.
maxionans вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Thread.Приложение не отвечает. Не запускается поток. Zerofill Общие вопросы Delphi 2 10.10.2009 16:04
Проблема с Thread Arnezami Общие вопросы .NET 2 04.10.2009 22:08
Функция "вешает" MFC приложение alaundo Visual C++ 2 27.06.2009 16:31
Работа с сессиями вешает хост ADSoft PHP 3 22.07.2008 12:57
Traffic Compressor вешает систему Спартак Софт 5 28.05.2008 15:42