Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.056 c
1-1116927138
Stef
2005-05-24 13:32
2005.06.14
прочитать ini файл на сайте в интернете


6-1110752730
Сетъ
2005-03-14 01:25
2005.06.14
Подскажите способ простейшего обмена данными между двумя ip ?


3-1115189906
Андрей Жук
2005-05-04 10:58
2005.06.14
Определение типа коннекта в Firebird


8-1109090868
VikOss
2005-02-22 19:47
2005.06.14
Jpeg


3-1115812937
Юленька
2005-05-11 16:02
2005.06.14
Удаление столбцов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский