![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| GuManOiD |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 12.9.2005 Репутация: нет Всего: нет |
Возможно ли сделать так что бы поток запущенный при создании формы не мешал ее прорисовке и работе с ней.
Не помогает. Пока идут вычисления форма замораживается. |
|||
|
||||
| Elfebet |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 545 Регистрация: 15.5.2006 Где: Украина. Запорожь е. Репутация: 2 Всего: 14 |
SetThreadPriority(thread.Handle, THREAD_PRIORITY_BELOW_NORMAL);
-------------------- Программист не должен всё знать... он должен знать где можно посмотреть |
|||
|
||||
| GuManOiD |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 12.9.2005 Репутация: нет Всего: нет |
Спасибо огромное.
|
|||
|
||||
| GuManOiD |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 12.9.2005 Репутация: нет Всего: нет |
К сожалению, при более больших математических нагрузках форма проходит стадию прорисовки, но работа с ней становится не возможной.
Это сообщение отредактировал(а) GuManOiD - 11.11.2006, 14:34 |
|||
|
||||
| BUGOR |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 12.3.2006 Репутация: 5 Всего: 16 |
Возможно поток кушает большое количество общего процессорного времени или другие программы ничуть не тормозят при выполнении этого потока?
|
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 13 Всего: 158 |
Sleep в цикл
|
|||
|
||||
| anwe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: нет Всего: 23 |
При создании формы создай поток в заморожен состоянии, прорисуй форму и потом запускай поток.
А по поводу
сделай твой поток "рабочим", то есть программа общается с пользователем через главный поток, отслежвиает все события на форме, а основную работу (математическую нагрузку) делает рабочий. |
|||
|
||||
| GuManOiD |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 12.9.2005 Репутация: нет Всего: нет |
Sleep повесит всю программу независимо от того от куда его вызвали. Имеется ввиду использовать другое событие? Добавлено @ 19:23 это как? поближе к простым рабочим программистам пожалуйста |
|||
|
||||
| Dude03 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.4.2006 Репутация: нет Всего: 6 |
Если прога не слишком большая то стоило выложить ее код сюда. Это ускорило бы разбирательство.
У меня такое ощущение, что вычисления у тебя выполняет тот же поток, что и проводит обработку сообщений, тогда конечно без 2-ч потоков тут не обойтись. Вообще-то это очень плохое правило помещать что-то требующее большого процессорного времени в поток, выполняющий оконную процедуру. |
|||
|
||||
| GuManOiD |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 12.9.2005 Репутация: нет Всего: нет |
Зато у меня нет такого ощущения...
Класс нового потока описан в отдельном Unit-е:
в ExecProc выполняются разные вычисления, там и так далее, запостить не могу, трабла с копирайтами... автор ругается. На событии OnCreate главной формы приложения я запускаю поток:
Добавлено @ 19:41
Именно поэтому мой поток не выполняет оконную процедуру Добавлено @ 19:44 Ну где же ты Snowy |
||||||
|
|||||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 13 Всего: 158 |
судя по ответам(не только по отквоченному), создается ощущение, что помощь как-будто бы и не нужна. добавляй хотя бы "imho" к своим категоричным заявлениям. по полкам: если в потоке сделать "while (1) {};", поток съест 100% проц.времени. если в потоке сделать частую синхронизацию(напр. Synchronize) с основным - и время съест и не даст основному работать. Sleep в потоке остановит поток. остальным это по боку. в такого рода задачах передавать инфу из потока лучше сообщениями. в общем, судя по описанию проблемы, активно используется именно блокирующая синхронизация. |
|||
|
||||
| anwe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: нет Всего: 23 |
Рабочий поток не создает окно, он не принимает какие-либо windows-сообщения. Он существует только для того, чтобы делать предназначенную ему работу на заднем фоне. Так вот, если поток, в котором у тебя ведутся расчеты, создается вместе с окном, создай его, но не запускай его. Запустишь непосредственно после прорисовки окна. Другими словами, попробуй запустить свой рабочий поток при обработке события формы OnActive или OnShow. |
|||
|
||||
| GuManOiD |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 79 Регистрация: 12.9.2005 Репутация: нет Всего: нет |
Попробуй на практике.
imho Твой совет немного не к моему вопросу... мну нужно не выждать время прорисовки, а во время прорисовки и далее выполнять действия. anwe, Спасибо, попробую, думаю вопрос можно пометить как решенный, т.к. большинство ответов на него это советы по реструктуризации программы, я интересовался собственно сабжом. |
||||
|
|||||
| dumb |
|
||||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 13 Всего: 158 |
а у меня где-то написано, что я теоретик?!
Sleep предлагался для снижения нагрузки на процессор(значение задержки = 1 напр.). но вообще это совет как-раз из области "костылей", ибо и без него все должно работать, если правильно реализовано. в твоем случае, похоже, это не так. в аттаче проект буквально из двух строк, который демонстрирует и возможность нормальной работы интерфейса при 100% загрузке в другом потоке, так и правоту этого высказывания:
Присоединённый файл ( Кол-во скачиваний: 2 )
test_thread_sleep.zip 1,31 Kb |
||||
|
|||||
| Poseidon |
|
||||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
GuManOiD, а если попробовать так:
И еще: Правильно будет все ресурсоемкие вычисления запихнуть в Execute. Доступ к VCL только через Synchronize. И хорошо бы прочитать - http://forum.vingrad.ru/topic-60076/view/all/index.html Это сообщение отредактировал(а) Poseidon - 12.11.2006, 00:58 -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
||||
|
|||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |