Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.01;
Скачать: CL | DM;

Вниз

формы, потоки и 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.011 c
15-1316145972
vajo
2011-09-16 08:06
2012.01.01
Win XP. Проблема входа в систему.


3-1269469439
adigozelov
2010-03-25 01:23
2012.01.01
TNT+ADO


15-1315203721
pasha_golub
2011-09-05 10:22
2012.01.01
Ода молодому поколению


3-1269357337
dima_q
2010-03-23 18:15
2012.01.01
Информирование клиентов базы.


15-1315686587
Юрий
2011-09-11 00:29
2012.01.01
С днем рождения ! 11 сентября 2011 воскресенье