Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.05.19;
Скачать: [xml.tar.bz2];

Вниз

Непонятный эффект подвисания   Найти похожие ветки 

 
NetBreaker666   (2003-04-29 18:05) [0]

На форме (точнее на одном их Control"ов формы) идет непрерывная отрисовка изображения в отдельном потоке. При попытке двигать модальнуй форму все приложение начисто виснет до тех пор, пока не счелкеншь мышкой где-нибудь на TskBar"е или где-нибудь вне формы. Я не знаю как еще это объяснить, могу выложить exe-шник - скачайте посмотрите. Впервые с таким встречаюсь.
http://www.asicdesign.ru/seismo/seismov.exe (где-то 480кб)
в нем откройте проект мастера обработки данных:
http://www.asicdesign.ru/seismo/fuckx.rar (где-то 700кб, версия RAR"a 3.00)


 
NetBreaker666   (2003-04-29 18:19) [1]

Да, вопрос: что это за д$%^мо, и как от него избавиться?


 
Romkin   (2003-04-29 18:33) [2]

VCL не потокобезопасна, поэтому рисование на форме из потока приводит к непредсказуемым результатам


 
Style   (2003-04-29 18:40) [3]

Рисуешь через Canvas???

Просто нужно синхронизировать потоки посмотри что такое Canvas.Lock
Canvas.UnLock


 
NetBreaker666   (2003-04-29 18:43) [4]

Рисую через OpenGL. VCL здесь не причем. Самое смешное, что если этому потоку выставить приоритет tpLowest или Idle, то все работает нормально (только скорость меня не устраивает). Могу выслать сорцы компонента - в торопях писал, может что-нибудь забыл.


 
Style   (2003-04-29 19:11) [5]

Может и время уходит на реинициализацию OpenGL ты что там меняешь WndClass control чтобы в нем через OGL рисовать??? а так давай на prirodniy@bk.ru интересно посмотреть. Мож чего и придумаю.


 
NetBreaker666   (2003-04-29 19:51) [6]

Неикакой WNDClass я не меняю. URLки вроде я дал (так быстрее чем по e-mail). Кладу исходники компонентов. (Обработку GLPaint не кидаю, ибо от нее мало чего зависит :( В GLPaint должен лежать обычный код отрисовки, без SwapBuffers, просто набор glBegin"ов с эндами.)

ClockThread.pas
unit ClockThread;

interface

uses
Windows, SysUtils, Classes;

type
TClockThread = class(TThread)
private
{ Private declarations }
fAct:Boolean;
fDel:Integer;

fOldTick:DWord;
fOnClk:TNotifyEvent;
fBClk,fAClk:TThreadMethod;
procedure SetFAct(T:Boolean);

protected
procedure Execute; override;

public

constructor Create;overload;
constructor Create(CreateSuspended: Boolean);overload;

published


property Active:Boolean read fAct write SetFAct;
property MinimalDelay:Integer read fDel write fDel;

property OnBeforeClock:TThreadMethod read fBClk write fBClk;
property OnClock:TNotifyEvent read fOnClk write fOnClk;
property OnAfterClock:TThreadMethod read fAClk write fAClk;

end;

implementation



procedure TClockThread.Execute;
var t:Integer;
begin

while not self.Terminated
do Begin
if not fAct then self.Suspend;
if not self.Terminated then Begin
t:=GetTickCount-fOldTick;
if t<MinimalDelay then Sleep(MinimalDelay-t);
fOldTick:=GetTickCount;
if Assigned(fBClk) then Synchronize(fBClk);
if Assigned(fOnClk) then fOnClk(self);
if Assigned(fAClk) then Synchronize(fAClk);
End;
End;
end;

procedure TClockThread.SetFAct(T:Boolean);
Begin
if (not fAct) and (T) then Begin
fAct:=True;
self.Suspended:=false;
End else fAct:=T;
End;




constructor TClockThread.Create(CreateSuspended: Boolean);
Begin
fAct:=true;
fDel:=0;
fOldTick:=GetTickCount;
inherited;
End;

constructor TClockThread.Create;
Begin
inherited Create(false);
End;

end.




 
NetBreaker666   (2003-04-29 19:53) [7]


GLControl.pas
unit GLControl;

interface

uses
Windows, SysUtils, Classes, Controls, OpenGl, ClockThread;




type
TGLControl = class(TCustomControl)
private
{ Private declarations }
pfd:PPixelFormatDescriptor;
dc:HDC;
hrc:HGLRC;
glpaint:TNotifyEvent;

clk:TClockThread;
fMaxFps:Word;//0..1000

fEn:Boolean;
fHandle:HWND;

fResize:TNotifyEvent;
fPainting:Boolean;
fcef:Boolean;
fOnReinit:TNotifyEvent;
fNeedResize:Boolean;
procedure SetMaxFPS(const t:Word);
procedure SetFEn(t:Boolean);
procedure __Resize(Sender:TObject);
protected
{ Protected declarations }

property OnResize;
public
{ Public declarations }


procedure SetDCPixelFormat;
destructor Destroy;override;


property Canvas;

property PixelFormatDescriptor:PPixelFormatDescriptor read PFD;
property DeviceContext:HDC read dc write dc;
property GLContext:HGLRC read hrc write hrc;

procedure Paint;override;

function Init:Boolean;

procedure ParallelPaint(Sender:TObject);
procedure FlushBuffer;
published
{ Published declarations }
constructor Create(AOwner: TComponent); override;
function CanFocus:Boolean;override;
function Focused:Boolean;override;

property ClockThread:TClockThread read clk;
property Constraints;
property MaxFPS:Word read fMaxFPS write SetMaxFPS default 25;
property Enabled:Boolean read fEn write SetfEn default True;
property Color;
property Handle read fHandle;


property OnReinit:TNotifyEvent read fOnReinit write fOnReinit;
property OnGLPaint:TNotifyEvent read glpaint write glpaint;
property OnControlResize:TNotifyEvent read fResize write fResize;
property ClearEveryFrame:Boolean read fcef write fcef default true;

property Align;
property Anchors;
property DragKind;
property DragCursor;
property DragMode;
property Font;
property ParentBiDiMode;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property TabOrder;
property TabStop;
property OnCanResize;
property OnClick;
property OnConstrainedResize;
property OnContextPopup;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDock;
property OnEndDrag;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnMouseWheel;
property OnMouseWheelDown;
property OnMouseWheelUp;

property OnStartDock;
property OnStartDrag;








 
NetBreaker666   (2003-04-29 19:57) [8]



property UseDockManager;
property DockSite;
property DockManager;
property OnDockDrop;
property OnDockOver;
property OnEnter;
property OnExit;
property OnGetSiteInfo;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnUnDock;


end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents("SeisVis", [TGLControl]);
end;

function TGLControl.Init:Boolean;
Begin
Result:=false;
if not self.HandleAllocated then exit;
if csDestroying in ComponentState then exit;


Result:=true;
if fHandle<>0 then exit;
fHandle:=TCustomControl(self).Handle;
DC:=GetDC(fHandle);
SetDCPixelFormat;
hrc:=wglCreateContext(dc);

wglMakeCurrent(dc,hrc);
glViewPort(0,0,ClientWidth,ClientHeight);
if Assigned(fOnReinit) then fOnReinit(self);
End;

constructor TGLControl.Create(AOwner:TComponent);
Begin
inherited Create(AOwner);
fHandle:=0;
new(pfd);
fillchar(pfd^,SizeOf(TPixelFormatDescriptor),0);
self.onResize:=__Resize;
fPainting:=false;
fcef:=true;
clk:=TClockThread.Create;
clk.FreeOnTerminate:=false;
clk.OnClock:=ParallelPaint;
clk.OnAfterClock:=FlushBuffer;
fNeedResize:=true;
Enabled:=true;
End;

function TGLControl.CanFocus:Boolean;
Begin
Result:=true;
End;

procedure TGLControl.Paint;
Begin
if fPainting then exit; //


 
A_Andrew   (2003-04-29 20:42) [9]

А ничего, если я твой компонент заюзаю ? А то у меня ничего не подвисает, а MAXFPS - действительно круто.


 
A_Andrew   (2003-04-29 20:44) [10]

Да юзай сколько хочешь... только ты попробуй его на модалной форме разместить, и MaxFPS в 1000 выставить.


 
NetBreaker666   (2003-04-29 20:56) [11]

Не понял?


 
Ixion   (2003-04-29 23:34) [12]


> NetBreaker666 © (29.04.03 20:56)


>А ничего, если я твой компонент заюзаю ?
>А то у меня ничего не подвисает, а MAXFPS - действительно круто.
> Да юзай сколько хочешь... только ты попробуй его на модалной
> форме разместить, и MaxFPS в 1000 выставить.


Сам себя похвалить решил ? :)))



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2003.05.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.007 c
3-59552
РВА
2003-04-25 14:03
2003.05.19
Запросы к лок. таблицам


3-59571
Jakommo
2003-04-27 14:30
2003.05.19
UML модель приложения на BoldSoft.


14-59894
Vlad Oshin
2003-04-29 10:23
2003.05.19
Кто такие ителлегенты?


3-59590
valmont
2003-04-28 07:05
2003.05.19
Перемещение по таблице


3-59545
Jaxtor
2003-04-24 10:22
2003.05.19
Транзакции





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