Форум: "Основная";
Текущий архив: 2012.01.01;
Скачать: [xml.tar.bz2];
Внизформы, потоки и TWebBrowser Найти похожие ветки
← →
HikTronic © (2010-07-05 09:47) [0]первый вопрос такой - пишу прогу консольную, создаю окно через winapi, инициализирую в нем огл, и мне надо в месте с параллельно отрисовкой окна и выполнением в ней вычислений отображать форму, которая не стопорила бы эту прогу.
пробовал через потоки делать//основная программа
CreateWND(true); // Создание окна
GLInit; // Инициализация Ogl"a
Looker:=TLooker.Create(false);
Looker.FreeOnTerminate:=true;
Looker.Priority:=tpLowest;
while Done=FALSE do цикл программы...
//TLooker.Execute:
Application.Initialize;
Application.CreateForm(TForm1, Form1);
logWrite("CreateForm",3); Application.Run;
Form1.Visible:=true;
Form1.Visible:=false;
но зависает и приложение и форма, по логу видно, что доходит до Onshow и все, дальше никак. подскажите, как решить?
и еще такой вопрос - у TWebBrowser можно ли управлять полосой прокрутки?
например, чтобы полоса прокрутки в определённый момент вставала в крайнее нижнее положение
← →
stas © (2010-07-05 16:48) [1]Форма должна быть создана в основном потоке.
← →
stas © (2010-07-05 16:50) [2]...и отображена тоже.
← →
HikTronic © (2010-07-05 17:29) [3]но тогда ведь весь основной поток остановиться до того момента, когда форма не будет закрыта, нет? просто я раньше с формами не работал, только с консольными приложениями
← →
stas © (2010-07-05 17:34) [4]если сделать form.show, то основной поток будет продолжать работу.
если form.ShowModal, то остановиится, до закрытия формы.
← →
stas © (2010-07-05 17:37) [5]да и наверное можно обойтись без Application.
А просто
form1:=Tfrom1.Create(nil);
form1.Show;
← →
Deltas © (2010-07-05 18:45) [6]
> stas © (05.07.10 17:34) [4]
> если сделать form.show, то основной поток будет продолжать
> работу.
> если form.ShowModal, то остановиится, до закрытия формы.
Полный бред. Главный поток продолжает работать, при чем все окна (в том числе не модальные) продолжают обрабатывать сообщения.
← →
HikTronic © (2010-07-05 18:48) [7]сделал перед основным циклом
form1:=Tfrom1.Create(nil);
form1.Show;
опять зависло на form1.Show;
← →
Deltas © (2010-07-05 18:52) [8]Хотелось бы посмотреть на Ваш "цикл программы" и как Вы организовали обработку сообщений из очереди главного потока.
И не понятно, почему в [0] сказано про Win API, когда работа с окнами выполняется с помощью VCL.
← →
HikTronic © (2010-07-05 19:09) [9]я окно инициализирую средствами winApi, хочу быть как можно меньше привязан к делфи.
while Done=FALSE do
if (PeekMessage(msg, 0, 0, 0, PM_REMOVE)) then
begin
if Msg.message=WM_QUIT then Done:=TRUE;
TranslateMessage(Msg);
DispatchMessage(Msg);
end
else
begin
if forDraw then Draw;
Phys;
end;
в процедурах Draw и Phys идет отрисовка огл и рассчет физики соответственно.
обработка:case msg of
WM_CLOSE : PostQuitMessage(0); // Auee??aiea ieia
WM_SIZE : if forLoad then ResizeWnd(LOWORD(lParam),HIWORD(lParam)); // Eciaiaiea ?acia?a
WM_KEYDOWN:keys[wParam]:= TRUE;
WM_KEYUP :
begin
keys[wParam]:= FALSE;
keysD[wParam]:= FALSE;
keysHold[wParam]:= FALSE;
end;
else Result:=DefWindowProc(Wnd,Msg,wParam,LParam);
← →
Deltas © (2010-07-05 19:24) [10]А загрузку процессора не смотрели? Не удивлюсь, если 100%. Сравните функции PeekMessage() и GetMessage(). Отрисовку нужно выполнять в оконной процедуре, обрабатывая сообщение WM_PAINT.
← →
HikTronic © (2010-07-05 19:41) [11]2Deltas:
разве причина в этом?
← →
Deltas © (2010-07-05 20:02) [12]У Вас поток отнимает все процессорное время, если только, конечно, Вы не вызываете Sleep() или прочие функции Win API, переводящие поток в режим ожидания, внутри процедур Draw() и Phys(), что очень врядли. WM_PAINT имеет низкий приоритет обработки по сравнению с другими сообщениями, и ему просто некогда обрабатываться.
> разве причина в этом?
Есть только один способ узнать - проверить.
← →
Deltas © (2010-07-05 20:06) [13]Если нужна постоянная смена кадров в клиентской области окна, определите какая частота кадров вам нужна, установите таймер SetTimer() и по таймеру отрисовывайте новое изображение в окне, предварительно подготавливая его в оперативной памяти, пока в очереди нет сообщений.
← →
HikTronic © (2010-07-05 20:36) [14]думаю, что проблема все таки не в этом, потому что если сделать
form1:=Tform1.Create(nil);
form1.Show;
while Done=FALSE do sleep(10);
то все равно все встает в тот же момент, что и раньше
← →
sniknik © (2010-07-06 02:14) [15]> while Done=FALSE do sleep(10);
>
> то все равно все встает в тот же момент, что и раньше
и где здесь выборка сообщений? так чему удивляться, "встает" правильно, там где остановил.
хочешь обойтись без VCL? пиши ему замену. в смысле изучи как работает, попробуй на нем, и пиши свое...
← →
Deltas © (2010-07-06 03:00) [16]
> form1:=Tform1.Create(nil);
> form1.Show;
> while Done=FALSE do sleep(10);
Вот это к чему вообще? Окно будет отображено и после этого оконная функция не обработает ни одного сообщения. Поток практически засыпает навсегда.
В первом случае у Вас цикл занимает все процессорное время, во втором случае пустой цикл просто "вешает" программу.
Еще раз повторяю, отрисовку нужно выполнять в оконной процедуре, обрабатывая сообщение WM_PAINT. У Вас в первом цикле сообщение WM_PAINT обрабатывает DefWindowProc(). Функция ничего не рисует, все что она делает это просто утверждает область обновления окна (validates the update region). Кстати, окно вообще не будет получать сообщения WM_PAINT, потому что оно отправляется системой окну только тогда, когда область обновления не пуста, а она у Вас пуста (хотя это зависит от того, как Вы реализовали свою процедуру Draw()). Для того, чтобы ее сделать не пустой, необходимо вызывать InvalidateRect() или InvalidateRgn().
← →
HikTronic © (2010-07-06 07:03) [17]давайте поставим вопрос по другому. меня в данный момент вполне устраивает реализация основного цикла. т.к. выдает вполне приличный результат. как в новом потоке правильно вывести форму? при создании потока не с формой, а с вычислениями, например, все идет нормально. как пытаюсь засунуть туда форму - тормозит
← →
HikTronic © (2010-07-06 07:08) [18]
> хочешь обойтись без VCL? пиши ему замену. в смысле изучи
> как работает, попробуй на нем, и пиши свое...
не очень люблю низкоуровневое на уровне win api, да и опыта маловато, поэтому не смогу полностью написать замену VCL. весь код, что есть сейчас - метод копипаста из разных источников, чуть переделанный по совету товарища моего, который в этом разбирается. сам я больше люблю алгоритмы, графику, физику и игровую механику.
← →
sniknik © (2010-07-06 09:30) [19]> при создании потока не с формой, а с вычислениями, например, все идет нормально. как пытаюсь засунуть туда форму - тормозит.
в VCL нормально, это когда формы/визуальная часть располагаются в основном потоке.
> не очень люблю низкоуровневое на уровне win api
кого это волнует при заявленном
> я окно инициализирую средствами winApi, хочу быть как можно меньше привязан к делфи.
понимаешь, что используя form1:=Tform1.Create(nil); ты уже "привязан" к дельфи и VCL? а значит и к его правилам.
> поэтому не смогу полностью написать замену VCL.
полностью, в одиночку это вряд ли кому дано, но не мешает одиночкам писать без него, реализуя только необходимое. (хотя это в 98% просто понты, в 1.8% учеба, и в остатке необходимость+"разное". ИМХО)
← →
Deltas © (2010-07-06 11:26) [20]
> sniknik © (06.07.10 09:30) [19]
> в VCL нормально, это когда формы/визуальная часть располагаются
> в основном потоке
Это не просто нормально, а только так и можно. Концепция Borland такова, что все компоненты VCL работают только в главном потоке, так как они не потокобезопасны.
> при создании потока не с формой, а с вычислениями, например,
> все идет нормально. как пытаюсь засунуть туда форму - тормозит
Если так нужно окно не в главном потоке, то про VCL в этом потоке нужно забыть и работать на чистом Win API. Но это совершенно не обязательно, можно организовать межпоточный обмен сообщениями через PostMessage(), выполняя всю работу с VCL в главном потоке по уведомлениям (через PostMessage()) не главного потока.
← →
Deltas © (2010-07-06 11:32) [21]Если кратко, то
> как в новом потоке правильно вывести форму?
Нельзя работать с VCL в дополнительных потоках.
← →
HikTronic © (2010-07-06 12:18) [22]ок, спасибо за доходчивые объяснения, буду делать основной цикл программы в дополнительном потоке, а форму в главном
← →
HikTronic © (2010-07-06 12:26) [23]все работает, еще раз спасибо.
а насчет полосы прокрутки в TWebBrowser никто не знает? ей можно управлять из кода?
← →
sniknik © (2010-07-06 12:54) [24]> ей можно управлять из кода?
можно.
из кода javascript можно, а значит из дельфи тоже, т.к. из него можно выполнять "внедренные" "скриптики". можно и без яваскрипта "якорями", с ними простым вызовом навигации.
← →
HikTronic © (2010-07-06 14:23) [25]а, точно, якори, совершенно забыл про них, благодарю
← →
Плохиш © (2010-07-06 19:57) [26]
> пишу прогу консольную, создаю окно через winapi, инициализирую
> в нем огл, и мне надо в месте с параллельно отрисовкой окна
> и выполнением в ней вычислений отображать форму
> формы, потоки и TWebBrowser
Консольная прога, с окнами на vcl и TWebBrowser. Интересно и какой великий смысл сиих извращений? Вам кто-то сказал, что консольные проги что-то быстрее считают?
← →
Юрий Зотов © (2010-07-06 20:50) [27]Бессмысленная каша какая-то. Вы можете на простом русском языке, без всяких терминов, объяснить, что же Вы в итоге хотите получить?
← →
HikTronic © (2010-07-06 20:50) [28]я тот еще извращенец. пишу игру на огл, физика box2d, лог пишется в html файл(почему не тхт как у всех? в html есть всякие фичи по оформлению - цвета,жирность шрифта, всплывающие пояснения - поэтому легче визуально воспринимается), так вот на форме у меня tWebBrowser, который этот лог открывает в себе параллельно основной программе, т.е. в реальном времени видно, что там в логе находится. +на форме Edit, куда вводятся консольные команды.
вот. теперь можно меня пинать за индусство и закидывать тапочками
← →
HikTronic © (2010-07-06 20:51) [29]2Юрий Зотов
я уже получил. да и в 17 посте вроде все понятно, нет?
← →
Leonid Troyanovsky © (2010-07-06 22:21) [30]
> HikTronic © (06.07.10 20:50) [28]
> вот на форме у меня tWebBrowser, который этот лог открывает
> в себе параллельно основной программе, т.е. в реальном времени
> видно, что там в логе находится.
Лог можно открывать и другой программой, что не в себе.
Хоть перпендикулярной, но реально видимой, издавна пользуемой.
> всякие фичи по оформлению - цвета,жирность шрифта, всплывающие
> пояснения - поэтому легче визуально
Оформление - фигня, главное в танке - результат.
--
Regards, LVT.
← →
HikTronic © (2010-07-06 22:27) [31]
> Лог можно открывать и другой программой, что не в себе.
мне еще надо с формы передавать сообщения игре - консольные команды.
> Оформление - фигня
на вкус и цвет..
← →
Leonid Troyanovsky © (2010-07-06 22:32) [32]
> HikTronic © (06.07.10 22:27) [31]
> мне еще надо с формы передавать сообщения игре - консольные
> команды.
Его зовут клиент-сервер, forever.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2010-07-06 22:38) [33]
> HikTronic © (06.07.10 22:27) [31]
> на вкус и цвет..
Дада, фломастеры разные.
Но, формулу c танком я тоже припомнить могу.
--
Regards, LVT.
← →
HikTronic © (2010-07-06 22:39) [34]что за формула с танком?
← →
Leonid Troyanovsky © (2010-07-06 22:44) [35]
> HikTronic © (06.07.10 22:39) [34]
> что за формула с танком?
Главное в танке - не обосраnmся (с)
--
Regards, LVT.
← →
HikTronic © (2010-07-06 22:54) [36]забавно, возьму на заметку
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2012.01.01;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.005 c