Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-1269587791
12
2010-03-26 10:16
2012.01.01
Как бы половчее сделать Аудит. Не триггером.


1-1278308829
HikTronic
2010-07-05 09:47
2012.01.01
формы, потоки и TWebBrowser


2-1316902702
Undria
2011-09-25 02:18
2012.01.01
Не работает код в Delphi XE2


15-1316065835
Gu
2011-09-15 09:50
2012.01.01
Свернуть процедуры


3-1269443878
gog
2010-03-24 18:17
2012.01.01
Не читаются unicode данные





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский