Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
ВнизРабота с потоками! Найти похожие ветки
← →
grol © (2005-05-28 21:13) [0]Здравствуйте мастера Delphi!!! Есть процедура GlobalRaschet. Она долго выполняется, если ее вызвать (там работа с массивами). Если процедура вызывается с потоком формы, то она
выполнится за 5 минут, но вот если процедуру вызвать в новом потоке, то выполнится она намного медленнее, даже примерно за 15-20 минут! Вопрос такой: с чем это может быть связано и как это устранить? Т.е. мне необходимо, наверное, увеличить приоритет этого потока или еще что-нибудь. И вообще правильно я создал поток? Уважаемые мастера Delphi помогите мне пожалуйста разобраться в чем дело. Спасибо заранее!
unit Result;
interface
uses
...
type
TResultForm = class(TForm)
...
private
public
end;
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
var
ResultForm: TResultForm;
...
procedure GlobalRaschet;
var ...
begin
....
end;
procedure TResultForm.Button1Click(Sender: TObject);
var
MyThread: TMyThread;
begin
MyThread := TMyThread.Create(False);
end;
procedure TMyThread.Execute;
begin
GlobalRaschet;
end;
end.
← →
Defunct © (2005-05-28 21:26) [1]grol © (28.05.05 21:13)
Здесь Вы показываете, что процедура выполняется, просто так (как локальный метод TMyThread) не видно ни как вы задаете исходные данные, ни как вы записываете результат. Может быть у вас там идет приостанов при синхронизации с главным потоком.
В общем из приведенного Вами кода нельзя дать ровным счетом никаких рекомендаций. Тут даже неизвестно повлияет ли повышение приоритета потока.
С уважением,
def
← →
Defunct © (2005-05-28 21:33) [2]> с чем это может быть связано и как это устранить?
Может быть связано с тем, что основной поток тоже занимает процессорное время, а когда вы вынесли из него GlobalRaschet, то ресурс процессора разделяется уже между двумя потоками, соотв. вычиления будут выполняться как минимум в 2 раза медленнее.
Чем больше потоков с вычислениями работает одновременно, тем больше времени требуется для выполнения каждого из потоков. (хотя суммарное время выполнения всей работы остается почти одинаковым)
← →
Cobalt © (2005-05-28 22:07) [3]2 Defunct © (28.05.05 21:33) [2]
> соотв. вычиления будут выполняться как минимум в 2 раза медленнее.
Далеко не факт!
Ведь первый поток - просто управляющая форма, она вообще спит, пока нет сообщений, не так ли?
← →
Alexander Panov © (2005-05-28 22:17) [4]Cobalt © (28.05.05 22:07) [3]
Далеко не факт!
Не только не факт, а совершенно не соответствует действительности.
← →
Defunct © (2005-05-28 22:28) [5]Cobalt © (28.05.05 22:07) [3]
Alexander Panov © (28.05.05 22:17) [4]
Господа, будьте внимательнее:
> Может быть связано с тем, что основной поток тоже занимает процессорное время, а когда вы вынесли из него GlobalRaschet, то ресурс процессора разделяется уже между двумя потоками, соотв. вычиления будут выполняться как минимум в 2 раза медленнее.
Имеется в виду, что вычисления вынесены в отдельный поток, плюс в основновном потоке остались еще какие-то вычисления. И приоритыты, как основного так и дополнительного потока одинаковые.
← →
Cobalt © (2005-05-28 22:37) [6]2 Alexander Panov © (28.05.05 22:17) [4]
Кстати, полез в TApplication.Run и MS SDK Help
Блин, это ж надо додуматься - WaitMessage в TApplication.Idle
Обалдеть!
А я его искал в TApplication.ProcessMessage почему-то...
← →
Defunct © (2005-05-28 22:51) [7]Cobalt © (28.05.05 22:37) [6]
А где ж ему еще быть?
"Idle" - бездействие/холостой ход.
← →
grol © (2005-05-29 00:08) [8]Так все таки как увелить приоритет нового потока? Помогите!
← →
Cobalt © (2005-05-29 00:21) [9]2 grol © (29.05.05 00:08) [8]
см. Defunct © (28.05.05 21:26) [1]
← →
Marser © (2005-05-29 00:58) [10]
> grol © (29.05.05 0:08) [8] [Новое
>сообщение][Ответить]
> Так все таки как увелить приоритет нового потока?
> Помогите!
Для начала убедись, что ты правильно используешь поток. Повышение приоритета тебе поможет вряд ли.
← →
-=XP=- © (2005-05-29 01:25) [11]Так все таки как увелить приоритет нового потока?
Вас что, носом ткнуть в справку? Вроде бы не начинающий, раз с потоками работаете. Ась?
← →
Alex Konshin © (2005-05-29 07:03) [12]grol © (29.05.05 00:08) [8]
Так все таки как увелить приоритет нового потока? Помогите!
Скорее всего дело не в приоритете, изменением приоритета можно добиться того, что и другие потоки будут работать медленно. Если есть такая разница, то значит, что что-то неверно в самом потоке.
Что же происходит в самом потоке помимо вычислений?
← →
grol © (2005-05-29 21:01) [13]Ну я же сказал вызывается процедура в которой идет работа с большими массивами, и в этой процедуре есть еще две вызываемые процедуры!!! Вот и все! А нет в главной процедуре с другой формы вызываются значения переменных и приравниваются к тем, что в этой процедуре!!! А зачем вообще нужна синхронизация??? И все таки, как увеличить приоритет потока??? Или это останется секретом для всех тех, кто не знает, например для меня? Спасибо заранее за ответы!!!
← →
Alexander Panov © (2005-05-29 21:08) [14]grol © (29.05.05 21:01) [13]
Если посмотреть на свойства TThread, то можно(неожиданно для себя) обнаружить такое свойство, как TThread.Priority.
Также можно поискать статьи про потоки, как на этом сайте, так и в интернете.
← →
Marser © (2005-05-29 21:09) [15]
> А зачем вообще нужна синхронизация???
Чтобы обезопасить приложение от конфликтов потоков при доступе к одним и тем же данным.
> И все таки, как увеличить приоритет потока???
TThread.Priority. Тут не поможет 100%
Просто потому, что по умолчанию приоритет создаваемого потока равен приоритету основного. И вычисления относятся к тому классу операций, которым повышение приоритета нужно только на критических участках.
← →
Alex Konshin © (2005-05-30 00:41) [16]grol © (29.05.05 21:01) [13]
Ну я же сказал вызывается процедура в которой идет работа с большими массивами, и в этой процедуре есть еще две вызываемые процедуры!!! Вот и все! А нет в главной процедуре с другой формы вызываются значения переменных и приравниваются к тем, что в этой процедуре!!! А зачем вообще нужна синхронизация??? И все таки, как увеличить приоритет потока??? Или это останется секретом для всех тех, кто не знает, например для меня? Спасибо заранее за ответы!!!
Избыток вопросительных и восклицательных знаков - признак неопытного программиста. Поспокойнее надо, но поподробнее и попонятнее. Ты меня понимаешь? Потому что я стараюсь чтобы меня поняли. Тебе же нужен ответ, а ты не хочешь постараться.
Еще раз вопрос: что происходит в этом потоке помимо вычислений? Меня не интересует, сколько и каких процедур на той или иной форме. Мне важно только, что там делается кроме вычислений. Например, нет ли там вызовов функций Win32 API или каких-то нетвоих методов? Если есть, то какие?
← →
evvcom © (2005-05-30 09:38) [17]Вероятнее всего ты слишком часто вызываешь Synchronize, что приостанавливает твои вычисления и заставляет ОС переключаться на основной поток, а это довольно затратно по времени. И не факт, что ОС немедленно переключится именно на твой основной поток, ведь в системе имеется еще море потоков ожидающих своего кванта времени. Получается, что твой доп.поток, не использовав отведенного ему времени, извещает ОС, что оно ему пока больше не требуется. Отсюда накладные расходы на переключение потоков, выражающиеся в тормозах.
Зачем тебе синхронизация с осн. потоком? Первое что приходит в голову, это какой-нить прогресс-бар. Тогда доп.поток должен извещать осн., только если прогресс-бар действительно изменит свое состояние-показание. Т.е. изменение процента надо посчитать в доп.потоке, и только в случае его существенного изменения извещать осн.поток.
← →
Alex Konshin © (2005-05-30 09:48) [18]Вообще нет смысла даже вызывать Synchronize в этом случае. Нужно просто послать сообщение и продолжать работать дальше. А Synchronize ждет.
Вот именно поэтому я и спрашиваю, что он так делает. Но похоже, что вопрошающему не нужны наши советы.
← →
sniknik © (2005-05-30 11:06) [19]конечно. кому нужны советы (?), главное доказать что вы ничего не знаете. (а советуете тут!!!) ;о)))
Synchronize кстати тут ни причем (частые вызовы), "причем" скорее ее(их) отсутствие... вы что не обратили внимание как процедура
> procedure GlobalRaschet;
> var ...
> begin
> ....
> end;
обьявлена? методом какого класса является? и как он в таком случае может ее вызывать? MyThread.Synchronize так чтоли? ;о)) а смысл? и даже если такие попытки были то обратите внимание где переменная потока описана, и как это тогда должно выглядеть.
вот чего точно смысла не имеет, так это обсуждение того чего в глаза не видели... даже если "хозяин" уверен что код ни при чем, и изза жуткой его секретности не показывает (не запантентовал его еще видать ;о))).
← →
grol © (2005-06-01 02:42) [20]Спасибо всем!!! Я вроде бы разобрался, только вот у меня не получается остановить поток, в том случае, если он запущен и производятся расчеты в процедуре Global...? Спасибо заранее!
← →
Defunct © (2005-06-01 03:43) [21]> grol
TerminateThread вам подойдет.
Хотя может у кого-то и хватит желания и сил придумать вам более правильный способ прерывания внешней процедуры Global...
← →
evvcom © (2005-06-01 08:40) [22]А зачем вообще вызывать эту Global...? Правильно прерывается работа TThread вызовом метода Terminate и проверкой в Execute флага Terminated. Это корректное завершение потока, все остальное не приветствуется.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.045 c