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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приоритет потока 
V
    Опции темы
GuManOiD
  Дата 11.11.2006, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 12.9.2005

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



Возможно ли сделать так что бы поток запущенный при создании формы не мешал ее прорисовке и работе с ней.
Код

Priority := tpIdle;

Не помогает. Пока идут вычисления форма замораживается.
PM MAIL   Вверх
Elfebet
Дата 11.11.2006, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 2
Всего: 14



SetThreadPriority(thread.Handle, THREAD_PRIORITY_BELOW_NORMAL);


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
GuManOiD
Дата 11.11.2006, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 12.9.2005

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



Спасибо огромное.
PM MAIL   Вверх
GuManOiD
Дата 11.11.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 12.9.2005

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



К сожалению, при более больших математических нагрузках форма проходит стадию прорисовки, но работа с ней становится не возможной.

Это сообщение отредактировал(а) GuManOiD - 11.11.2006, 14:34
PM MAIL   Вверх
BUGOR
Дата 11.11.2006, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 12.3.2006

Репутация: 5
Всего: 16



Возможно поток кушает большое количество общего процессорного времени или другие программы ничуть не тормозят при выполнении этого потока?


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
dumb
Дата 11.11.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



Sleep в цикл
PM MAIL   Вверх
anwe
Дата 11.11.2006, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: нет
Всего: 23



При создании формы создай поток в заморожен состоянии, прорисуй форму и потом запускай поток.
А по поводу
Цитата
но работа с ней становится не возможной

сделай твой поток "рабочим", то есть программа общается с пользователем через главный поток, отслежвиает все события на форме, а основную работу (математическую нагрузку) делает рабочий.
PM MAIL   Вверх
GuManOiD
Дата 11.11.2006, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 12.9.2005

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



Цитата(dumb @  11.11.2006,  16:49 Найти цитируемый пост)
Sleep в цикл 


Sleep повесит всю программу независимо от того от куда его вызвали.

Цитата(anwe @  11.11.2006,  18:28 Найти цитируемый пост)
прорисуй форму и потом запускай поток.


Имеется ввиду использовать другое событие?

Добавлено @ 19:23 
Цитата(anwe @  11.11.2006,  18:28 Найти цитируемый пост)
сделай твой поток "рабочим", то есть программа общается с пользователем через главный поток, отслежвиает все события на форме, а основную работу (математическую нагрузку) делает рабочий. 


это как? поближе к простым рабочим программистам пожалуйста smile
PM MAIL   Вверх
Dude03
Дата 11.11.2006, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.4.2006

Репутация: нет
Всего: 6



Если прога не слишком большая то стоило выложить ее код сюда. Это ускорило бы разбирательство.
У меня такое ощущение, что вычисления у тебя выполняет тот же поток, что и проводит обработку сообщений, тогда конечно без 2-ч потоков тут не обойтись. Вообще-то это очень плохое правило помещать что-то требующее большого процессорного времени в поток, выполняющий оконную процедуру.
PM MAIL   Вверх
GuManOiD
Дата 11.11.2006, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 12.9.2005

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



Зато у меня нет такого ощущения...

Класс нового потока описан в отдельном Unit-е:
Код

TExecProcThread = class(TThread)
    constructor Create(FormCaption : string; LoaderFormOwner : TComponent);
  protected
    procedure Execute; override;
    procedure ExecProc;
  end;


в ExecProc выполняются разные вычисления, там и так далее, запостить не могу, трабла с копирайтами... автор ругается.

На событии OnCreate главной формы приложения я запускаю поток:
Код

var
  AppLoader : TExecProcThread;
begin
AppLoader := TExecProcThread.Create('Starting up',Application);
AppLoader.Priority := tpLowest; //или Idle
AppLoader.Resume;
end;


Добавлено @ 19:41 
Цитата(Dude03 @  11.11.2006,  19:33 Найти цитируемый пост)
Вообще-то это очень плохое правило помещать что-то требующее большого процессорного времени в поток, выполняющий оконную процедуру. 


Именно поэтому мой поток не выполняет оконную процедуру smile

Добавлено @ 19:44 
Ну где же ты Snowy smile
PM MAIL   Вверх
dumb
Дата 11.11.2006, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



Цитата(GuManOiD @  11.11.2006,  19:22 Найти цитируемый пост)
Sleep повесит всю программу независимо от того от куда его вызвали

судя по ответам(не только по отквоченному), создается ощущение, что помощь как-будто бы и не нужна. добавляй хотя бы "imho" к своим категоричным заявлениям.

по полкам:
если в потоке сделать "while (1) {};", поток съест 100% проц.времени.
если в потоке сделать частую синхронизацию(напр. Synchronize) с основным - и время съест и не даст основному работать.
Sleep в потоке остановит поток. остальным это по боку.
в такого рода задачах передавать инфу из потока лучше сообщениями.

в общем, судя по описанию проблемы, активно используется именно блокирующая синхронизация.
PM MAIL   Вверх
anwe
Дата 11.11.2006, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: нет
Всего: 23



Цитата
поближе к простым рабочим программистам пожалуйста
Освной поток - поток интерфейса пользователя: он создает свое окно, поэтому он получает оконные сообщения, реагирует на все действия, связанные с окном. Он отвечает пользователю. 
Рабочий поток не создает окно, он не принимает какие-либо windows-сообщения. Он существует только для того, чтобы делать предназначенную ему работу на заднем фоне.
Так вот, если поток, в котором у тебя ведутся расчеты, создается вместе с окном, создай его, но не запускай его. Запустишь непосредственно после прорисовки окна. Другими словами, попробуй запустить свой рабочий поток при обработке события формы OnActive  или OnShow.
PM MAIL   Вверх
GuManOiD
Дата 11.11.2006, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 12.9.2005

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



Код

Sleep в потоке остановит поток. остальным это по боку.

Попробуй на практике.

Цитата(dumb @  11.11.2006,  19:55 Найти цитируемый пост)
судя по ответам(не только по отквоченному), создается ощущение, что помощь как-будто бы и не нужна. добавляй хотя бы "imho" к своим категоричным заявлениям.


imho Твой совет немного не к моему вопросу... мну нужно не выждать время прорисовки, а во время прорисовки и далее выполнять действия.

anwe, Спасибо, попробую, думаю вопрос можно пометить как решенный, т.к. большинство ответов на него это советы по реструктуризации программы, я интересовался собственно сабжом.
PM MAIL   Вверх
dumb
Дата 12.11.2006, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



Цитата(GuManOiD @  11.11.2006,  22:19 Найти цитируемый пост)
Попробуй на практике.

а у меня где-то написано, что я теоретик?! smile

Цитата(GuManOiD @  11.11.2006,  22:19 Найти цитируемый пост)
мну нужно не выждать время прорисовки, а во время прорисовки и далее выполнять действия.

Sleep предлагался для снижения нагрузки на процессор(значение задержки = 1 напр.).
но вообще это совет как-раз из области "костылей", ибо и без него все должно работать, если правильно реализовано. в твоем случае, похоже, это не так.

в аттаче проект буквально из двух строк, который демонстрирует и возможность нормальной работы интерфейса при 100% загрузке в другом потоке, так и правоту этого высказывания:
Цитата(GuManOiD @  11.11.2006,  19:22 Найти цитируемый пост)
Sleep повесит всю программу независимо от того от куда его вызвали.



Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  test_thread_sleep.zip 1,31 Kb
PM MAIL   Вверх
Poseidon
Дата 12.11.2006, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

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



GuManOiD, а если попробовать так:

Код

TExecProcThread = class(TThread)
  protected
    procedure Execute; override;
    procedure ExecProc;
  public
    constructor Create(CreateSuspennded: Boolean; FormCaption : string; LoaderFormOwner : TComponent);
  end;

{...}


constructor TExecProcThread.Create(CreateSuspennded: Boolean; FormCaption : string; LoaderFormOwner : TComponent);
begin
inherited Create(CreateSuspennded);
{...}
end;



Код

var
  AppLoader : TExecProcThread;
begin
AppLoader := TExecProcThread.Create(True, 'Starting up', Application);
AppLoader.Priority := tpLowest; //или Idle
AppLoader.FreeOnTerminate:= True;
AppLoader.Resume;
end;


И еще: 
Цитата(GuManOiD @  11.11.2006,  19:39 Найти цитируемый пост)
в ExecProc выполняются разные вычисления
 Правильно будет все ресурсоемкие вычисления запихнуть в Execute. Доступ к VCL только через Synchronize. И хорошо бы прочитать - http://forum.vingrad.ru/topic-60076/view/all/index.html


Это сообщение отредактировал(а) Poseidon - 12.11.2006, 00:58


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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