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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дочерний поток забирает 100% CPU, Это правильно ?? 
:(
    Опции темы
Гость_Игорь
Дата 25.6.2005, 23:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











В чем может быть дело?
Мое приложение запускает два дочерних потока,
первый сканирует участок памяти в ожидании того что второй
поток запишет туда то что надо.
Т.е. никаких особо ресурсо затратных действий эти потоки
не производят. Но загрузка CPU - 100%

Меня это настораживает , т.к. год назад я писал похожую программу (на той же
версии Delphi) и потоков там было больше, но загрузка CPU при этом была маленькой.

Установка разных приоритетов потоков ни к чему не привела.

Где и что я делаю неправильно??
Заранее спасибо.

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


Delphi developer
****


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

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



Цитата
Где и что я делаю неправильно??
А откуда мы знаем? Кода то нет! Выложи код, мы посмотрим что не так.



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


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



Цитата
А откуда мы знаем? Кода то нет! Выложи код, мы посмотрим что не так.


Да, Пока телапатов здесь нет...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Гость_Игорь
Дата 26.6.2005, 13:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Сорри.
Я просто подумал, что эта проблема имеет общеизвестные грабли
типа "что-то забыл указать, дописать"
Вот и не привел исходник.


Вот он. Собственно ничего особенного.
Код

type
  PByte = ^TByte;
  TByte = byte;

procedure TChecker.Execute;
var StartTime, FinishTime : double;
    RightNow : double;
    B : byte;
    P : PByte;
begin

  StartTime:= Now;

  //FinishTime:= StartTime + 1 hour
  FinishTime:= StartTime + 0.0416;

  while not self.Terminated do begin

    B:= P^;
    if B = 0 then Break;

    RightNow:= Now;
    if RightNow >= FinishTime then Break;
  end;
end;


Стартую его таким образом:

Код

procedure TForm1.FormCreate(Sender: TObject);
begin
  Checker:= TChecker.Create;
  Checker.Resume;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Checker.Terminate;
  Checker.WaitFor;
  Checker.Free;
end;


Второй поток не привожу, т.к. и без него загрузка 100%
И вообще , я наверно от него откажусь - хватит одного.

  Вверх
maxim1000
Дата 26.6.2005, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



а он и должен занимать максимум ресурса процессорного времени - у него ж куча дел:
прочитать ^p, проверить, присвоить время, проверить время, прочитать ^p, проверить, присвоить время, проверить время, ...
дело в том, что Windows не может знать, что значит этот код лично для этой программы, а вдруг там очень важная работа, которую нужно сделать как можно скорее?

насколько я понял, суть потока состоит в том, чтобы ждать одного из двух событий
вот это-то и надо сказать Windows, чтобы она(оно, он?) знала, что много процессорного времени тебе не нужно, и его можно использовать с пользой для других дел... для этого часто используются объекты синхронизации

в данном случае можно было бы сделать, например, так:
1. создаем объект Event - аналог ^P, вместо того, чтобы туда что-то писать, нужно его просто активизировать (PulseEvent)
2. создаем второй объект Waitable Timer - аналог FinishTime

а в дочернем потоке вместо цикла вызываем функцию WaitForMultipleObjects, которая остановится, когда один из объектов просигналит

про все эти объекты синхронизации и функции работы с ними можно (и стоит) почитать в MSDN: http://msdn.microsoft.com

P.S.
кстати, можно таймер и не создавать, а вместо этого пользоваться функцией WaitForSingleObject с правильно указанным вторым параметром...


--------------------
qqq
PM WWW   Вверх
Гость_Игорь
Дата 26.6.2005, 19:27 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо за идею!
Малость не понятно, но уже знаю в каком направлении двигаться.

Насчет моего потока - у него не было причин не загружать проц smile

  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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